深挖C语言:深入理解指针(1) 目录1.内存和地址2.指针变量和地址2.1 取地址操作符 2.2 指针变量2.3 解引用操作符 *2.4 指针变量的大小3.指针变量类型的意义3.1 指针的解引用3.2 指针 - 整数3.3 void* 类型指针4.指针的运算4.1 指针 - 指针4.2 指针 - 指针4.3 指针的关系运算正文1.内存和地址内存通俗来讲是一个临时存储数据的地方将内存比作宿舍楼假设我们要找内存中的数据也就是某一个房间挨个找的效率非常低但是如果根据楼层和房间的情况给每个房间加上编号那么就会大大提高找房间的效率由此我们引出了地址这一概念。地址相当于宿舍楼中每个房间的门牌号例如101、102、201……在CPU中央处理器中内存被划分为一个个的内存单元每个内存单元的大小是1个字节。其中每个内存单元就相当于一个房间一个内存单元有8个比特位一个比特位可以存储一个2进制的0或者1好比房间内可以住8名学生每个学生代表一个比特位。在CPU中每个内存单元都有一个地址根据这个地址就能够在CPU中快速的找到某一个内存单元C语言中给这些地址起了一个新的名字“指针”。结论内存单元编号 地址 指针2.指针变量和地址2.1 取地址操作符 操作对象变量、数组元素、结构体成员。作用得到操作数在内存中首字节地址。在C语言中创建变量其实就是在向内存中申请空间如图我们已知变量a向内存中申请了空间为了得到变量a的地址就要用到 的使用如图注意int 类型的变量有4个字节理论上来讲是有四个指针的但是输出的结果只有一个指针输出指针是第一个字节的指针已知第一个字节的指针就能够按照从小到大的顺序找到后面是3个字节的指针。2.2 指针变量用 得到的指针是一串数值也是需要用变量来进行存储的例如0x006FFD77存储该数值的变量称为“指针变量”。解释p的左边是 int ** 说明 p 是指针变量int 说明 p 所存储的指针指向的是 int 类型对象。指针变量的类型最好与所存储指针指向的对象类型相同例如 char 类型对应的指针变量的 类型是 char *2.3 解引用操作符 *操作对象 指针变量。作用拿到指针所存储的真实数据。如图利用解引用操作符可以直接对指针所指向的内容进行访问与修改增加了写代码的途径。2.4 指针变量的大小指针变量大小与类型无关与代码所处的平台有关在 x64 平台下所有类型的指针变量大小都是 8 个字节而在 x86 平台下大小都是 4 个字节。这是因为 x64 平台总共有64跟地址线一个地址线能够存储一个二进制的0或者1,一个地址就是64个二进制位组成的二进制序列存储起来需要 8 个字节的空间指针变量的大小就是 8 个字节。3.指针变量类型的意义3.1 指针的解引用对比下面两段代码在调试时观察内存的变化代码1代码2结果得知代码1会将int的4个字节全部改为0但是代码2只是将n的第一个字节改为0结论指针类型决定了对指针解引用时操作权限有多大一次能够操作几个字节。例如char* 的指针一次只能操作一个字节而int* 类型的指针一次能操作四个字节。3.2 指针 - 整数根据代码观察指针的变化不难看出char* 类型的指针变量 1 跳过了一个字节int* 类型的指针变量 1 跳过了四个字节指针变量1 代表着跳过一个所指向的元素 往指针数值大的跳跃- 是往指针数值小的跳跃。结论指针类型决定了指针向前或者向后跨一步的距离有多大。3.3 void* 类型指针void* 类型指针是 无具体类型的指针或者称为 泛型指针作用接受任意类型的指针在函数参数部分用该类型可以实现泛型编程的效果使得一个函数来处理多种类型的数据。局限性void* 指针变量不能够直接进行 解引用操作 和 指针的-运算。4.指针的运算指针三种基本运算指针 - 指针、指针 - 指针、指针的关系运算4.1 指针 - 指针在内存中数组是连续存放的只要知道第一个元素的地址就能顺藤摸瓜找到后面所有元素。如图4.2 指针 - 指针如图结果9结论指针 - 指针 得到的是指针之间的元素个数。前提两个指针指向同一块空间4.3 指针的关系运算如图指针就是地址地址就是编号编号就是数值因此指针可以用来进行比较。数组中随着下标的增长数组元素的地址是由小逐渐变大的。最后感谢阅读欢迎大家交流与指正。