C语言笔记之指针2
3. 数组指针 vs 指针数组
3.1 数组指针
指向一个数组指针称为数组指针。
int n = 0;
int* p = &n;
int arr[] = {1,2,3,4,5,6};
int* q = arr;
3.2 指针数组
指针是一个类型,也可以组成一个数组,这样的数组称为指针数组。
[]
的优先级高于*
,那么p先和[]结合,说明这是一个数组。再和int*
结合,说明这个数组里的每个元素都是一个指针,每个元素都能保存一个地址。
4. 常量指针 vs 指针常量
4.1 常量指针const int *p
可以写作int const *p
,p
是int*
类型,const
修饰的是*p
,所以*p
是常量,表示p
指向的地址里的值不可修改,也就是说,*p
里的值不能再重新赋值了,但是可以修改p
指向的地址。
int a = 10;
int b = 20;
const int *p = &a;
p = &b; // 可以
*p = 100; // 错误
4.2 指针常量int * const p
p
是int*
类型,那么const
修饰的是p
,所以p
是常量,表示p
指向的地址不可修改,即p
不能再指向别的地方了,但是可以修改p
指向的这个地址里的值。
int a = 10;
int b = 20;
int * const p = &a;
p = &b; // 错误
*p = 100; // 允许
4.3 常量指针常量const int * const p
p
是int*
类型,两个const
分别修饰了p
和*p
, 所以p
和*p
都是常量,表示p
指向的地址不可修改,同时p
指向的地址里的值也不可修改。
int a = 10;
int b = 20;
const int *const p = &a;
p = &b; // 错误
*p = 100; // 错误
定义了一个指针,那就一定要知道这个指针指向的什么地方,而且要保证这个指针是真实有效的
No. | 例子 | 名称 | 指向的值 | 地址 |
---|---|---|---|---|
1 | const int *p /int const *p |
常量指针 | 不可改变 | 可改变 |
2 | int* const p |
指针常量 | 可改变 | 不可改变 |
3 | const int * const p |
常量指针常量 | 不可改变 | 不可改变 |
*
之前的const
修饰指向的变量,*
之后的const
修饰指针。