指针变量的定义
- *修饰指针变量
- 保存谁的地址 就先定义谁
- 从上往下整体替换 变量名
*p
int num
int *p
目的 | 实现 |
定义指针变量 保存int arr[5]的首地址 | int (*p)[5]; |
定义指针变量 保存int fun(int, int)的入口地址 | int (*p)(int, int); |
定义指针变量 保存struct stu lucy的地址 | struct stu *p; |
指针变量的类型
- 自身的类型:将指针变量名拖黑,剩下啥类型,指针变量自身就是啥类型
- 指向的类型:将指针变量名和离它最近的一个*一起拖黑,剩下啥类型指针变量指向就是啥类型
例子 | 自身类型 | 指向类型 |
int **p; | int ** | int * |
int (*p)(int, int); | int (*)(int, int) | int fun(int, int) |
一个奇怪但正确的论证
- []是*()的缩写:A[B] == *(A+B)
- arr[1] == *(arr+1) == *(1+arr) == 1[arr]
- 为什么arr作为地址 代表的是第0个元素的地址
- &arr[0] == &*(arr+0) == arr+0 == arr
字符串与指针
char str[] = "hello";
//"hello"存放在str字符数组中,如果是局部数组,str在栈区;是全局数组,str在全局区;
str[0] = 'H';
// 合法
char *str = "hello";
//str是指针变量(栈区/全局区)占4字节 保存字符串"hello string"的首元素地址
//字符串"hello"本身存储在文字常量区(只读)
str[0] = 'H';
// 非法,可能导致未定义行为