一;指针变量的类型
int p;
//定义中有效
指针变量自身的类型:将变量名拖黑 剩下啥类型 指针变量自身就是啥类型
指针变量指向的类型:将变量名和离他最近的一个一起拖黑 剩下啥类型 指针变量指向的类型就是啥类型
指向。。。的类型 == 保存。。。类型变量的地址
指针变量的跨度:由指针变量指向的类型大小决定
指针变量+1个跨度
指针变量的取值宽度:指针变量指向的类型决定
void test05() {int num = 0x01020304; char *p1;p1 = # printf("*p1 = %#x\n", *p1);//0x04 short *p2;p2 = # printf("*p2 = %#x\n", *p2);//0x0304 int *p3;p3 = # printf("*p3 = %#x\n", *p3);//0x01020304 }
运行结果:
二:指针变量的初始化
*三:&取地址符 和 指针解引用符号的区别
void test08() { int num = 10; //使用中 //num为int //&num 为 int * //对表达式取& 加一个* int *p = #// *p == num //p 的类型为 int * //*p 的类型为 int //对指针变量取* 表达式减一个* //& 与 *相遇 从右往左 一次抵消 printf("%d\n", *&num);//*&num==num //*p == num ? //*p = *&num == num; //*&*&*&*&*&*&p == p}
四:指针的注意事项
void test01() { //1、void 不能用于定义变量 //void num;//err //2、void *可以定义变量 //p的类型为void *在32位平台 4B,所以可以定义变量p void *p;//万能指针-->可以保存任意类型的地址 int num = 10; p = # //float f = 3.14f; //p = &f; //不能通过 万能指针 范围所存储的空间对应的内容 // printf("*p = %d\n", *p);//err 不能使用*p //必须对 万能指针 强制类型转换 才能取对应空间的内容 printf("*p = %d\n", *(int *)p); //3、不要操作未初始化的指针变量 //p1保存的是一个随机地址 容易访问非法内容 造成段错误 int *p1; //printf("*p1 = %d\n", *p1);//段错误 //4、不要操作 初始化 为NULL的指针变量 int *p2 = NULL;//printf("*p2 = %d\n", *p2);//段错误 //5、不要给指针变量赋 无意义的数值 int *p3 = 2000; //printf("*p3 = %d\n", *p3);//段错误 //6、不要操作越界的空间 int data = 100; int *p4 = &data; p4 = p4+1; //printf("*p4 = %d\n", *p4);//非法操作}
五:数组元素的指针
案例:数组元素的指针变量 遍历数组元素内容
运行结果:
案例:数组元素的指针变量给数组元素获取键盘输入