小工具知识网

当前位置: 首页 > 行业知识 > 【C语言基础】:深入理解指针(二)

行业知识

【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 

                指针越界访问

上一篇:轻松获取图像资源,图面下载全攻略!

下一篇:Android源码开发环境搭建全攻略,轻松搭建开发环境!