C语言指针与数组相关知识整理

C语言指针与数组相关知识整理

1. 指针基础语法

int *p;  // 推荐:int* p; 但 * 紧跟变量名更不易混淆
  • 指针变量的声明格式:数据类型 *变量名
  • * 是解引用运算符,不是指针名的一部分
  • 指针名建议使用 pptr 提示其为指针

2. 指针的初始化

int num = 100;
int *p = #
int *q = NULL;
  • 指针初始化常用方式:
    1. 指向一个变量地址
    2. 赋值为 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};
// arr = arr2; // 错误:数组名不可赋值

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; // 指向第 i+n 个元素
p -= n; // 指向第 i-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;  // 两者都不可改
  • const 修饰的是 *p 还是 p

11. 求数组最大最小值

void get_max_min(int arr[], int len, int *pmax, int *pmin);
  • 通过指针返回多个结果,是 C 语言的常见手段

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]
  • [] 是语法糖,底层实现基于指针运算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值