指针操作---C语言

下面描述指针变量的基本操作,通过程序来说明

/*定义一个数组个3个指针*/
int urn[5] = {100, 200, 300, 400, 500};   
int *ptr1, *ptr2, *ptr3;

1.赋值

可以把地址赋给指针。例如用数组名、带地址运算符&的变量名、另一个指针进行赋值。

ptr1 = urn;      //把一个地址赋给指针,数组名是数组的首元素首地址
ptr2 = &urn[2];  //把数组的第三个元素的地址赋给指针

2.解引用

 *  运算符给出指针指向地址上储存的值。如下面代码值中,打印出来的*ptr = 100.

//打印指针的值(该指针指向的地址)、储存在指针地址上的值、以及指针自己的地址
printf("指针的值 = %p, 储存在指针地址上的值 = %d ,针自己的地址 = %p\n", ptr1, *ptr1, &ptr1);

3.取值

和所有变量一样,指针变量也要自己的地址。如&ptr1指向ptr1的指针

//打印指针的值(该指针指向的地址)、储存在指针地址上的值、以及指针自己的地址
printf("指针的值 = %p, 储存在指针地址上的值 = %d ,针自己的地址 = %p\n", ptr1, *ptr1, &ptr1);

4.指针与整数相加

可以使用+运算符把指针与整数相加,或者把整数与指针相加。无论是哪种情况,整数都会与指针所指向的数据类型的字节数相乘,然后把结果与初始地址相加,比如定义一个指针int *ptr1;   那么ptr1+4 与&urn4相当于ptr1所指向的那个变量的地址(初始地址)+4×sizeof(int)

//指针加法
ptr3 = ptr1 +4;         //ptr1的地址值加上4×sizeof(int)

5.递增指针

递增指向数组元素的指针,可以让指针指向数组的下一个元素。因此ptr1++相当于把ptr1的值加上1×sizeof(int),也就是4(因为int为4个字节),ptr1指向urn[1]

ptr1 = urn;     //把一个地址赋给指针,数组名是数组的首元素首地址
ptr1++;          //++后指针变量ptr1指向urn[1]

6.指针减去一个整数

可以使用“-”运算符从一个指针减去一个整数。

ptr3 = &urn[4];        //指针赋值,给指针绑定一个地址
ptr3 - 2 与 &urn[2]等价      //相当于指针向前移动了两个int(8个字节)

7.递减指针

ptr2 = &urn[2];  //把数组的第三个元素的地址赋给指针
ptr2--;          //--后指针变量ptr1指向urn[1]

8.指针求差

可以计算两个指针的差值(注意:计算两个指针的和值是没有意义的,但是计算差值还是有一定意义的)。通常两个指针分别指向同一数组的不同元素,通过指针求差,可以计算出两个数组之间的距离。注意:差值的单位与数组类型的单位相同

ptr2 - ptr1 = 2
//意思是这两个指针【所指向的元素】相隔两个int,胃不适两个字节

【注意】

1. 在指针递增或者递减时需要注意指针越界问题。因为编译器不会检查指针是否仍会指向数组元素。C语言只能保证指向数组任意元素的指针和正向数组后面第一个位置的指针有效。但是,如果递增或者递减一个指针超出了这个范围,则是未定义的。

2. 注意解引用时可能会解引用到数组后面一个位置的指针(越界指针)。我们可以解引用指向数组任意元素的指针,但是,即使指针指向数组后面一个位置是有效的,也能解引用这样的指针。但一般越界指针是没意义的。

注:本文内容整理来自《C Primer Plus》中的内容

猜你喜欢

转载自blog.csdn.net/baidu_37973494/article/details/82749189