概括图:
一.指针进阶。
A.指针与常量。(重点const作用于哪个域)
1.指向常量的指针(指针常量):这种指针自身值不能被修改,但指针可以修改指向。
例:
#include <stdio.h>
int main()
{
int num = 123;
int const cnum = 111; //只读变量
int const *p = &cnum; //指向只读变量的只读指针
printf("cnum: %d, &cnum: %p\n", cnum, &cnum);
printf("*p: %d, p: %p\n", *p, p);
*p = 1235; //自身值无法改变,这句无法通过。
p = num; //指向可以改变,这句可以通过。
printf("cnum: %d, &cnum: %p\n", cnum, &cnum);
printf("*p: %d, p: %p\n", *p, p);
num = 110; //这样就改变了p的值。
printf("cnum: %d, &cnum: %p\n", num, &num);
printf("*p: %d, p: %p\n", *p, p);
return 0;
}
#注意:
建议const写在后面:
A. const所修饰的类型是正好在它前面的那一个。
B. 我们很多时候会用到typedef的类型别名定义。比如typedef char* pchar,如果用const来修饰的话,当const在前面的时候,就是const pchar,你会以为它就是const char* ,但是你错了,它的真实含义是char* const。是不是让你大吃一惊!但如果你采用const在后面的写法,意义就怎么也不会变,不信你试试!
2.指向非常量的常量指针(常量指针):这种自身值可以修改,但指向不能被修改。
例:int *const p = # //const在星号左边是指向常量的指针,修饰*自身值无法改变指向可以改变、放在右边就是常量指针,修饰p自身值可以改变指向不能改变。
例:
#include <stdio.h>
int main()
{
int num = 123;
int const cnum = 111; //只读变量
int * const p = &cnum; //常量指针
*p = 1024; //自身值可以改变
printf("*p: %d\n", *p);
num = 110; //改变了p指向的数据的值。
printf("*p: %d, num = %d\n", *p, num);
p = &cnum; //指向不能改变,这句无法通过。
return 0;
}
3.指向常量的常量指针:指针自身值不能被修改,同时指针指向也不能被修改。
例:
#include <stdio.h>
int main()
{
int num = 123;
int const cnum = 111; //只读变量
int const * const p = &cnum; //指向常量的常量指针。
*p = 1024; //自身值不改变,这句无法通过。
p = &cnum; //指向不能改变,这句无法通过。
return 0;
}
4.指向"指向常量的常量指针"的指针:int const * const *pp = &p;
例:
#include <stdio.h>
int main()
{
int num = 123;
int const cnum = 111; //只读变量
int const * const p = # //指向常量的常量指针
int co