行业知识
【C语言基础】:深入理解指针(二)
2026-11-05 03:35:52
来源:互联网转载
文章目录
- 深入理解指针
- 一、指针运算
- 1. 指针 +- 整数
- 2. 指针 - 指针
- 3. 指针的关系运算
- 二、野指针
- 1. 野指针成因
- 2. 如何避免野指针
- 三、assert断言
- 四、指针的使用和传址调用
- 4.1 strlen的模拟实现
- 4.2 传值调用和传址调用
- 五、指针与数组
- 5.1 数组名的理解
- 5.2 指针访问数组
- 5.3 一���数组传参的本质
深入理解指针
上期回顾:【C语言基础】:深入理解指针(一)
一、指针运算
指针的基本运算有三种,分别是:
1. 指针 ± 整数
2. 指针 - 指针
3. 指针的关系运算
1. 指针 ± 整数
在C语言中,我们知道数组在内存中是连续存放的,所以我们只要知道了数组第一个元素的地址,就可以顺藤摸瓜找到后面元素的地址。
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };#include// 指针 +- 整数int main(){int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = &arr[0];int sz = sizeof(arr) / sizeof(arr[0]); // 计算元素个数int i = 0;for (i = 0; i上述示例中,通过 *(p + i) 的方式可以实现指针向前移动 i 个位置,并访问对应位置的数组元素。
2. 指针 - 指针
在C语言中,不止整数之间可以进行运算,其实指针与指针之间也可以进行运算,指针与指针之间可以进行减法运算,两个指针相减得到的是一个整数,表示它们之间相隔元素的个数。
#include// 指针 - 指针// 模拟strlen库函数my_strlen(char *s){char* p = s;while (*p != '3. 指针的关系运算
')p++;return p - s;}int main(){printf("%d\n", my_strlen("abc"));return 0;}二、野指针
#includeint main(){int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = &arr[0];int sz = sizeof(arr) / sizeof(arr[0]); // 计算数组之间的元素个数int i = 0;while (p在上述示例中,通过指针 p 和数组大小 sz 的比较,保证了在不越界的情况下遍历整个数组。
1. 野指针成因
野指针就是指指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
int main(){int* p; // 局部变量未初始化,默认随机值*p = 30;return 0;}指针未初始化
局部变量未初始化,默认随机值
int main(){int arr[10] = { 0 };int* p = &arr[0];int i = 0;for (i = 0; i // 当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;}int n = 100;return &n;}int main(){int* p = test();printf("%d\n", *p);return 0;}int num = 10;int* p1 = #int* p2 = NULL;*p1 = 20;// *p2 = 20; // errprintf("%d\n", *p1);// printf("%d\n", *p2);return 0;}int arr[10] = { 0 };int* p = &arr[0];int i = 0;for (i = 0; i指针越界访问