44深入理解C指针之---指针安全
一、指针安全:指针的声明和初始化问题
1、指针不恰当的声明:
1)、声明的意思和真是的意图不一致,可以通过格式搞定;
2)、使用宏定义时,展开的含义有变,通过格式搞定;
3)、使用类型定义,使用更加方便
1 1 #include <stdio.h> 2 2 3 3 int main(int argc, char **argv) 4 4 { 5 5 int var1; 6 6 printf("input the var1: "); 7 7 scanf("%d", &var1); 8 8 int var2; 9 9 printf("input the var2: "); 10 10 scanf("%d", &var2); 11 11 12 12 printf("演示不恰当的指针声明:\n"); 13 13 int *ptr1, ptr2; 14 14 ptr1 = &var1; 15 15 ptr2 = var2; 16 16 printf("*ptr1: %d and ptr1: %p\n", *ptr1, ptr1); 17 17 printf("var1: %d and &var1: %p\n", var1, &var1); 18 18 printf("ptr2: %d and &ptr2: %p\n", ptr2, &ptr2); 19 19 printf("var2: %d and &var2: %p\n", var2, &var2); 20 20 printf("\n"); 21 21 22 22 #define PINT int* 23 23 printf("使用宏定义的方式定义指针:\n"); 24 24 PINT ptr3, ptr4; 25 25 ptr3 = &var1; 26 26 ptr4 = var2; 27 27 printf("*ptr3: %d and ptr3: %p\n", *ptr3, ptr3); 28 28 printf("var1: %d and &var1: %p\n", var1, &var1); 29 29 printf("ptr4: %d and &ptr4: %p\n", ptr4, &ptr4); 30 30 printf("var2: %d and &var2: %p\n", var2, &var2); 31 31 printf("\n"); 32 32 33 33 printf("使用类型定义的方式定义指针:\n"); 34 34 typedef int* PPINT; 35 35 PPINT ptr5, ptr6; 36 36 ptr5 = &var1; 37 37 ptr6 = &var2; 38 38 printf("*ptr5: %d and ptr5: %p\n", *ptr5, ptr5); 39 39 printf("var1: %d and &var1: %p\n", var1, &var1); 40 40 printf("*ptr6: %d and ptr6: %p\n", *ptr6, ptr6); 41 41 printf("var2: %d and &var2: %p\n", var2, &var2); 42 42 43 43 return 0; 44 44 }
2、特征:
1)、提供一种可移植的方式来声明与系统中可寻址的内存区域一致的长度
2)、用作sizeof操作符的返回值的类型
3)、用作内存相关函数malloc()和strlen()的参数类型
4)、常用来声明字符个数、循环计数、数组索引的长度
5)、可以用在指针的算术运算上
3、应用:
1)、打印是占位符是%zu,也可以是%u、%lu
2)、不要将负数赋值给size_t类型,一定要赋值整数才行
3)、对指针使用sizeof运算获取指针长度
代码如下:
人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。