• C语言天花板——指针(初阶)


    🌠🌠🌠

    大家在刚刚接触C语言的时候就肯定听说过,指针的重要性以及难度等级,以至于经常“谈虎色变”,但是今天我来带大家走进指针的奇妙世界。🎇🎇🎇


    一、什么是指针🤔

    指针理解的两个要点:

    1️⃣指针是内存中一个最小单元的编号,也就是地址

    2️⃣平常口语中说的指针,通常指的是指针变量,是用来存放地址的变量

    数据存储在内存中,是以二进制的方式进行存储的,每一个二进制找到它对应的地址存储起来

    例如这样的一个整型变量a,在内存中他的存储方式就是:

    我们可以看到这样一个一个的格子,这一个格子便是我们的内存单元,单位是字节,上面代码中的整型变量a,就占四个字节,也就是图中红色区域开辟的空间,里面存的就是变量a。  🎊🎊🎊                                                                                                                                                                🥳🥳🥳                                                              🥳🥳🥳                               单元编号 == 地址 == C语言中的“指针”

    二、指针类型 🤔

    同数据类型一样,指针也分各种类型,如图:

    值得注意的是指针大小是固定的,在32位的环境下占4位,64位的环境下占8位

    那么在抛出一个问题,既然所占字节大小都一样为什么还要区分指针类型呢?

    指针类型有意义么?🤔🤔🤔

    1️⃣指针类型决定了在解引用操作的时候,访问了几个字节

    在int类型的指针中,解引用会访问4个字节

    在char类型的指针中,解引用只会访问1个字节

    2️⃣指针类型决定了指针在+1/-1跳过了几个字节

    三、野指针🤔

    概念:指针指向的位置是不可知,不确定的,随机的。

    野指针成因:

    1️⃣指针未初始化

    2️⃣指针越界访问

    3️⃣ 指针指向的空间释放

    如何规避野指针:

    🎇指针初始化

    🎇避免指针越界

    🎇指针指向的空间释放,指针及时置NULL

    🎇避免返回局部变量的地址

    🎇指针使用之前检查其有效性

    四、指针运算🤔

    1️⃣整数加减整数

    指针+-整数->实际上是移动了一个指针类型的大小,而指针大小一般是4/8个字节

    1. int main(){
    2. int arr[] = { 10,9,8,7,6,5,4,3,2,1 }
    3. int* p = arr;
    4. p++;
    5. return 0;
    6. }

    2️⃣指针-指针

    前提:两个指针指向的是同一块区域,指针类型是相同的
    1. int main()
    2. {
    3. int arr[10] = { 0 };
    4. //指针-指针的前提:两个指针指向同一块区域,指针类型时相同的
    5. //指针-指针差值的绝对值,指针和指针之间的元素个数
    6. printf("%d\n", &arr[9] - &arr[0]);
    7. printf("%d\n", &arr[0] - &arr[9]);
    8. return 0;
    9. }
    结论:指针-指针得到的差值的绝对值是指针与指针之间的元素个数

    五、二级指针🤔

    概念:二级指针变量是存放一级指针变量的地址的

    1. int main()
    2. {
    3. int a = 10;
    4. int* p = &a;//p是指针变量,一级指针变量
    5. int** pp = &p;//pp指针变量,二级指针变量
    6. //int** * ppp = &pp;//pp是指针变量,三级指针变量
    7. //......
    8. return 0;
    9. }

    其实指针不止有一级指针和二级指针,还有三级四级甚至是多级,但是我们在正常情况下很少可以用到。

    六、指针数组🤔

    指针数组是指针还是数组?🤔

    答案:是数组,是存放指针的数组🛹🛹🛹

    字符数组:存放字符的数组

    整型数组:存放整形的数组

    指针数组:存放指针(地址)的数组

    1. int main()
    2. {
    3. int arr1[] = { 1,2,3,4,5 };
    4. int arr2[] = { 2,3,4,5,6 };
    5. int arr3[] = { 3,4,5,6,7 };
    6. //指针数组
    7. int* arr[] = { arr1,arr2,arr3 };
    8. return 0;
    9. }

    注意:(数组名可以表示首元素的地址)

    今天我们的指针就讲到这里,之后我还会更新一些更高阶的指针,感谢大家的支持!!!

  • 相关阅读:
    Xshell连接不上虚拟机的解决方法
    JavaScript基础-简单易懂总结
    web安全之XSS攻击
    Centos7 DNS 服务器配置步骤
    Java 值传递 or 引用传递?
    Linux 后台开发必知的 I/O 优化知识总结
    完成头像上传功能:使用node+express实现将前端发送的base64格式的图片转化为png格式的图片并保存在文件夹,同时将相对路径保存在数据库中
    网络安全学习--入侵检测和紧急响应
    springboot+微信小程序校园疫情智慧防控系统毕业设计源码011133
    铁威马NAS如何开启二次验证提高系统安全性
  • 原文地址:https://blog.csdn.net/2301_77125473/article/details/132918922