概述:主要讲述指针的递增、递减、加法(指针加上整数)、减法(指针减去整数)和指针相减
下面描述指针变量的基本操作,通过程序来说明
/*定义一个数组和5个指针*/
int urn[5] = {100, 200, 300, 400, 500};
int *ptr1, *ptr2, *ptr3, *ptr4;
可以把地址赋给指针。例如用数组名、带地址运算符&的变量名、另一个指针进行赋值。
ptr1 = urn; //把一个地址赋给指针,数组名是数组的首元素首地址
ptr2 = &urn[2]; //把数组的第三个元素的地址赋给指针
* 运算符给出指针指向地址上储存的值。如下面代码值中,打印出来的*ptr1 = 100.
//解引用储存在指针地址上的值
printf("储存在指针地址上的值 = %d\n", *ptr1); //注意:只会解引用数组的第一个元素的值
和所有变量一样,指针变量也有自己的地址。如&ptr1指向ptr1的指针
//打印指针自己的地址和指针的值(该指针指向的地址)
printf("指针ptr1自己的地址 = %p\n", &ptr1);
printf("ptr1 = %p\n", ptr1);
printf("ptr2 = %p\n", ptr2);
可以使用+运算符把指针与整数相加,或者把整数与指针相加。无论是哪种情况,整数都会与指针所指向的数据类型的字节数相乘,然后把结果与初始地址相加,比如定义一个指针int *ptr1; 那么ptr1+4 与&urn4相当于ptr1所指向的那个变量的地址(初始地址)+4×sizeof(int)
//指针加法
ptr3 = ptr1 + 4; //ptr1的值加上4×sizeof(int)
printf("指针加法:ptr3 = %p\n", ptr3); //ptr3指向urn[4]
递增指向数组元素的指针,可以让指针指向数组的下一个元素。因此ptr1++相当于把ptr1的值加上1×sizeof(int),也就是4(因为int为4个字节),ptr1指向urn[1]
//递增指针
ptr1++; //ptr1++后指针变量ptr1指向urn[1]
printf("递增指针:ptr1++ = %p\n", ptr1++);
可以使用“-”运算符从一个指针减去一个整数。
//指针减去一个整数
ptr4 = ptr2 - 1; //相当于指针向前移动了一个int(4个字节)
printf("指针减法:ptr4 = %p\n", ptr4); //ptr4指向urn[3]
//printf("&urn[3] = %p\n", &urn[3]);
7.递减指针
//递减指针
ptr2--; //ptr2--后指针变量ptr2指向urn[1]
printf("递减指针:ptr2-- = %p\n", ptr2--);
8.指针求差
可以计算两个指针的差值(注意:计算两个指针的和值是没有意义的,但是计算差值还是有一定意义的)。通常两个指针分别指向同一数组的不同元素,通过指针求差,可以计算出两个数组之间的距离。注意:差值的单位与数组类型的单位相同。
//指针求差
int num = 0;
num = ptr3 - ptr4; //两个指针变量值相减,得到num个sizeof(int)
printf("指针求差:ptr3 - ptr4 = %d\n", num); //意思是这两个指针【所指向的元素】相隔一个int
运行结果及分析:
完整代码:
#include
int main()
{
/*定义一个数组和4个指针*/
int urn[5] = { 100, 200, 300, 400, 500 };
int *ptr1, *ptr2, *ptr3, *ptr4;
ptr1 = urn; //把一个地址赋给指针,数组名是数组的首元素首地址
//解引用储存在指针地址上的值
printf("指针ptr1指向地址上的值 = %d\n", *ptr1); //注意:只会解引用数组的第一个元素的值
//打印指针自己的地址和指针的值(该指针指向的地址)
printf("指针ptr1自己的地址 = %p\n", &ptr1);
printf("ptr1 = %p\n", ptr1);
ptr2 = &urn[2]; //指针赋值,给指针绑定一个地址.这里把数组的第三个元素的地址赋给指针
printf("ptr2 = %p\n", ptr2);
//指针加法
ptr3 = ptr1 + 4; //ptr1的值加上4×sizeof(int) //ptr3指向urn[4]
printf("指针加法:ptr3 = %p\n", ptr3);
//递增指针
ptr1++; //ptr1++后指针变量ptr1指向urn[1]
printf("递增指针:ptr1++ = %p\n", ptr1++);
//指针减去一个整数
ptr4 = ptr2 + 1; //ptr4指向urn[3]
printf("指针减法:ptr4 = %p\n", ptr4); //相当于指针向前移动了一个int(4个字节)
//printf("&urn[3] = %p\n", &urn[3]);
//递减指针
ptr2--; //ptr2--后指针变量ptr2指向urn[1]
printf("递减指针:ptr2-- = %p\n", ptr2--); //--后指针变量ptr1指向urn[1]
//指针求差
int num = 0;
num = ptr3 - ptr4;
printf("指针求差:ptr3 - ptr4 = %d\n", num); //意思是这两个指针【所指向的元素】相隔一个int
return 0;
}
【注意】
1. 在指针递增或者递减时需要注意指针越界问题。因为编译器不会检查指针是否仍会指向数组元素。C语言只能保证指向数组任意元素的指针和正向数组后面第一个位置的指针有效。但是,如果递增或者递减一个指针超出了这个范围,则是未定义的。
2. 注意解引用时可能会解引用到数组后面一个位置的指针(越界指针)。我们可以解引用指向数组任意元素的指针,但是,即使指针指向数组后面一个位置是有效的,也能解引用这样的指针。但一般越界指针是没意义的。