// 【C Prime Plus】学习笔记,Chapter 10,数组和指针之五 // 指针的赋值,加减运算 // Page 667 #include <stdio.h> int main(void) { int *ptr0,*ptr1,*ptr2; // 如果指针没有初始化,进行 ++ 运算,编译会warning使用了没有初始化的指针,但是不是严重错误 //ptr0++; // 如果没有初始化,就给指针所指的"地址"赋值,其实这个地址是不确定的,编译能通过,仅仅是警告,但是链接就显示这是严重错误的 // 可能会覆盖其他的地址上的数据,或者直接导致程序崩溃 // *ptr0=5; int arn[5]={100,200,300,400,500}; // (1) 给指针赋值,通常是数组名 或者 用&运算符取某个地址 ptr0 = arn; ptr1 = &arn[1]; printf("指针ptr0的值(地址)是:%ld\n",ptr0); printf("指针ptr1的值(地址)是:%ld\n",ptr1); // (2) * 运算,所谓的解指引, 就是取指针对应的值 int x = *ptr0; // (3) &运算,就是取地址运算,可以取指针它自身的地址 printf("指针ptr0自身的地址是:%ld\n",&ptr0); // (4) 加整数N到指针上,这种算法实际就是移动N个单元,单元就是指针的所指的基本数据类型 // (减整数N也一样的意思,移动方向相反) // 不论是指针是什么类型的,int,long,或double ,这里的N都必须是整数,因为指针作为地址,其值本质上unsigned int ptr2=ptr0+2; // 找到ptr0的地址,然后向后移动2个单元.(不是移动ptr0哦,ptr0本身是没有改变的) printf("指针ptr2的值(地址)是:%ld\n",ptr2); printf("指针ptr2地址保存的值arn[2]:%ld\n",*ptr2); // (5) 使用 ++ 或 -- 运算 ptr0++; // 这样改变了ptr0的指向 printf("指针ptr0的值(地址)是:%ld\n",ptr0); printf("指针ptr0地址保存的值:%ld\n",*ptr0); ptr0--; printf("指针ptr0的值(地址)是:%ld\n",ptr0); printf("指针ptr0地址保存的值:%ld\n",*ptr0); //(6) 2个指针做差运算: 结果并非是想当然的十六进制的地址数值本身的差,而是指针的单元间距 int y = ptr1-ptr2; //低位减高位 printf("指针ptr1-ptr2的值(地址)是:%ld\n",y); // 结果是-1,并非-4 int z = ptr2-ptr1; // 高位减低位 printf("指针ptr2-ptr1的值(地址)是:%ld\n",z); // 结果是 1,并非 4 //--- return 0; }
输出结果:
指针ptr0的值(地址)是:1245024
指针ptr1的值(地址)是:1245028
指针ptr0自身的地址是:1245052
指针ptr2的值(地址)是:1245032
指针ptr2地址保存的值arn[2]:300
指针ptr0的值(地址)是:1245028
指针ptr0地址保存的值:200
指针ptr0的值(地址)是:1245024
指针ptr0地址保存的值:100
指针ptr1-ptr2的值(地址)是:-1
指针ptr2-ptr1的值(地址)是:1