C语言指针与数组相关知识整理
1. 指针基础语法
int *p;
- 指针变量的声明格式:
数据类型 *变量名
*
是解引用运算符,不是指针名的一部分- 指针名建议使用
p
或 ptr
提示其为指针
2. 指针的初始化
int num = 100;
int *p = #
int *q = NULL;
- 指针初始化常用方式:
- 指向一个变量地址
- 赋值为
NULL
表示暂不可用
3. 空指针与野指针
int *p;
int *q = test();
- 空指针:
NULL
,安全 - 野指针:指向随机/已释放地址,危险
- 悬空指针:原本合法,后指向无效地址
4. 值传递与指针传递
void swap(int a, int b);
void swap2(int *a, int *b);
void modify2(int **pp);
- 普通变量传参是值传递,不能修改原变量
- 传递指针可修改指向内容
- 修改指针本身需使用二级指针
5. 指针与数组
5.1 数组名的本质
int arr[] = {1,2,3};
int *p = arr;
5.2 数组不能整体赋值
int arr2[] = {4,5,6};
5.3 数组传参退化为指针
void func(int *arr, int len);
- 数组传参时会退化为指针
sizeof(arr)
在函数内获取的是指针大小,不能用于求长度- 必须显式传递数组长度
6. 数组指针与指针数组
int *ptr_arr[3];
int (*arr_ptr)[3];
int *arr[3]
:元素为指针的数组int (*arr)[3]
:指向长度为3数组的指针- 优先级:
[] > *
,结合性:[] 左结合, * 右结合
7. 指针运算
7.1 加减整数
p += n;
p -= n;
7.2 指针相减
int diff = q - p;
8. 数组遍历
方式一:下标方式
for (int i = 0; i < len; i++)
printf("%d ", arr[i]);
方式二:指针方式
int *p = arr;
while (p < arr + len)
printf("%d ", *p++);
9. 数组逆置
使用下标
for (int i = 0; i < len / 2; i++)
swap(arr[i], arr[len - 1 - i]);
使用指针
int *start = arr, *end = arr + len - 1;
while (start < end)
swap(*start++, *end--);
10. 常量指针
const int *p;
int *const p;
const int *const p;
11. 求数组最大最小值
void get_max_min(int arr[], int len, int *pmax, int *pmin);
12. 二维数组与数组指针
void test(int arr[][5], int len);
void test2(int (*arr)[5], int len);
- 二维数组传参需指定列数
- 推荐使用数组指针:
int (*p)[cols]
13. 运算符[]的本质
arr[i] ≡ *(arr + i) ≡ *(i + arr) ≡ i[arr]