目录
一、void指针
二、NULL指针
三、指向指针的指针
1.指向指针的指针
2.指针数组和指向指针的指针
四、常量和指针
1.常量
2.指向常量的指针
3.常量指针
4.指向“指向常量的常量指针”的指针
一、void指针
- void指针我们把它称之为通用指针,就是可以指向任意类型的数据。也就是说,任何类型的指针都可以赋值给void指针。
代码举例:
#includeint main() { int num = 1024; int *pi = # char *ps = "LoveC"; void *pv; pv = pi; printf("pi: %p, pv: %pn", pi, pv); pv = ps; printf("ps: %p, pv: %pn", ps, pv); return 0; }
运行结果:
二、NULL指针
- 在C语言中,如果一个指针不指向任何数据,则称之为空指针,用NULL来表示。
#define NULL ((void *)0)
- 当不清楚要将指针初始化为什么地址时,请将它初始化NULL;在对指针进行解引用时,先检查该指针是否为NULL。这种策略可以为今后编写大型程序节省大量的调试时间。
- NULL不是NUL:NULL用于指针和对象,表示控制,指向一个不被使用的地址;而‘ ‘’表示字符串的结尾。
三、指向指针的指针
1.指向指针的指针
#define NULL ((void *)0)
1.指向指针的指针
代码举例:
#includeint main() { int num = 520; int *p = # int **pp = &p; printf("num: %dn", num); printf("*p: %dn", *p); printf("**pp: %dn", **pp); printf("&p: %p,pp: %pn", &p,pp); printf("&num: %p,p: %p, *pp: %pn", &num, p, *pp); return 0; }
运行结果:
2.指针数组和指向指针的指针
- 至少有两个好处:① 避免重复分配内存;② 只需要进行一处修改
- 代码的灵活性和安全性都有了显著提高
代码举例:
#includeint main() { char *cBooks[] = { " ", " ", " ", " ", " ", "<带你学C带你飞>"}; char **byFishC; char **jiayuLoves[4]; int i; byFishC = &cBooks[5]; jiayuLoves[0] = &cBooks[0]; jiayuLoves[1] = &cBooks[1]; jiayuLoves[2] = &cBooks[2]; jiayuLoves[3] = &cBooks[3]; printf("FishC出版的图书有: %sn", *byFishC); printf("小甲鱼喜欢的图书有: n"); for(i = 0;i< 4;i++) { printf("%sn", *jiayuLoves[i]); } return 0; }
运行结果:
四、常量和指针
1.常量
- 常量应该是这样:520,'a',3.14
- 或者这样:
#define PRICE 520
#define A'a'
#define PI 3.14
- 还可以使用const关键字修饰,把变量变成只读,不可写入不可修改:
const int price = 520;
const char a = 'a';
const float pi = 3.14;
2.指向常量的指针
- 指针可以修改为指向不同的常量
- 指针可以修改为指向不同的变量
- 可以通过解引用来读取指针指向的数据
- 不可以通过解引用修改指针指向的数据
- 常量应该是这样:520,'a',3.14
- 或者这样:
#define PRICE 520 #define A'a' #define PI 3.14
- 还可以使用const关键字修饰,把变量变成只读,不可写入不可修改:
const int price = 520; const char a = 'a'; const float pi = 3.14;
2.指向常量的指针
- 指针可以修改为指向不同的常量
- 指针可以修改为指向不同的变量
- 可以通过解引用来读取指针指向的数据
- 不可以通过解引用修改指针指向的数据
代码举例:
#includeint main() { int num = 520; const int cnum = 880; const int *pc = &cnum; printf("cnum:%d,&cnum:%pn",cnum,&cnum); printf("*pc:%d,pc:%pn",*pc,pc); pc = # printf("num:%d,&num:%pn",num,&num); printf("*pc:%d,pc:%pn",*pc,pc); num = 1024; printf("*pc:%d,pc:%pn",*pc,pc); return 0; }
运行结果:
3.常量指针
(1)指向非常量的常量指针
- 指针自身不可以被修改
- 指针指向的值可以被修改
(2)指向常量的常量指针
- 指针自身不可以被修改
- 指针指向的值也不可以被修改
代码举例:
#includeint main() { int num = 520; const int cnum = 880; const int * const p = # //不可被修改,不能执行 // *p = 1024; // printf("*p: %dn",*p); //不可被修改,不能执行 // p = &cnum; // printf("*p: %dn",*p); num = 1024; printf("*p: %dn",*p); return 0; }
运行结果:
4.指向“指向常量的常量指针”的指针
代码举例:
#includeint main() { int num = 520; const int cnum = 880; const int * const p = # const int * const *pp = &p; printf("pp: %p,&p: %pn",pp,&p); printf("*pp: %p, p: %p, &num: %pn",*pp,p,&num); printf("**pp: %d, *p: %d, num: %dn",**pp,*p, num); return 0; }
运行结果: