【c语言】指针小结

一、指针是什么?

可以通过运算符&来取得变量实际保存的 起始地址

(这个地址是虚拟地址,并不是真正物理内存上的地址。)

数据类型 *标识符 = &变量;

int *pa = &a; int *pa = NULL;

(NULL表示地址为0的内存空间,这个地址是无法使用的,读写该地址会报错)

pa 中存储的就是变量 a 的地址,也叫做指向 a 的指针。

int *a,b; 等价于 int *a;int b;而不等价于 int *a; int *b;

💡 变量的初始化!int *pa;

声明指针变量之后,编译器会为指针变量本身分配一个内存空间,但是这个内存空间里面的值是随机的,也就是说, 未初始化的指针变量指向的地址是随机的。 这时一定不能去读写指针变量指向的地址,因为那个地址是随机地址,很可能会导致严重后果。

  • 错误案例:*p = 1; 错误的,p指向的内存是随机的,不可以赋值
  • 正确案例: p = &a; *p = 1 正确的,此时p指向a的地址,可以为a赋值

💡 pa中存储的是a变量的内存地址,那如何通过地址去获取a的值呢?
这个操作就叫做解引用 比如*pa就能获得a的值。

二、指针的运算

指针仅在同一段内存中比较才有意义。指针本质上就是一个无符号整数,代表了内存地址。它可以进行运算,但是规则并不是整数运算的规则。

  1. 指针与整数值的加减运算

    指针与整数值的运算,表示指针的移动。

    c 复制代码
    int* i;
    i = (int *)0x0034;
    i = i + 1; // 0x0038

    i是一个指针,指向内存地址0x0034, 不要误认为i + 1等于0x0035,正确答案是0x0038(也就是sizeof(int)的大小 )。

    原因是i + 1表示指针向内存地址的高位移动一个单位,而一个单位的short类型占据两个字节的宽度,所以相当于向高位移动两个字节。

    同样的,i - 1得到的结果是0x0032。指针移动的单位,与指针指向的数据类型有关。数据类型占据多少个字节,每单位就移动多少个字节。

  2. 指针与指针的加法运算

    两个指针进行加法是非法的。

  3. 指针与指针的减法

    相同类型的指针允许进行减法运算,返回它们之间的距离,即相隔多少个数据单位。

    高位地址减去低位地址,返回的是正值;低位地址减去高位地址,返回的是负值。

    这时,减法返回的值属于ptrdiff_t类型,这是一个带符号的整数类型别名,具体类型根据系统不同而不同。这个类型的原型定义在头文件stddef.h里面。

    c 复制代码
    int* i1;
    int* i2;
    
    i1 = (int *)0x0034;
    i2 = (int *)0x0038; // i2 与 i1之间相差4个字节,就是一个int的距离
    
    ptrdiff_t dist = i2 - i1;
    printf("%td\n", dist);  // 1
  4. 指针与指针的比较运算

    指针之间的比较运算,比较的是各自的内存地址哪一个更大,返回值是整数1(true)或0(false)。

三、多级指针

这里的 03 号格子就叫二级指针,05 号格子就叫指针,而 07 号就是我们平常用的变量。

不管几级指针有两个最核心的东西:

  • 指针本身也是一个变量,需要内存去存储,指针也有自己的地址
  • 指针内存存储的是它所指向变量的地址

这就是我为什么多级指针是逻辑上的概念,实际上一块内存要么放实际内容,要么放其它变量地址,就这么简单。

怎么去解读int **a这种表达呢?

int **a 可以把它分为两部分看,即int**a,后面 *a 中的*表示 a 是一个指针变量,前面的 int* 表示指针变量a

只能存放 int* 型变量的地址。

相关推荐
REDcker1 小时前
OpenSSL 完整文档
c++·安全·github·c·openssl·后端开发
橘颂TA1 天前
【剑斩OFFER】算法的暴力美学——力扣 675 题:为高尔夫比赛砍树
数据结构·算法·c·结构与算法
程芯带你刷C语言简单算法题4 天前
Day48~对于高度为 n 的台阶,从下往上走,每一步的阶数为 1,2,3 中的一个。问要走到顶部一共有多少种走法
c语言·开发语言·学习·算法·c
余衫马7 天前
为什么在 Windows 上用 Clang/LLVM?
c++·windows·c
REDcker9 天前
AIGCJson 库介绍与使用指南
c++·json·aigc·c
消失的旧时光-194310 天前
函数指针 + 结构体 = C 语言的“对象模型”
c·对象模型
REDcker11 天前
RTCP 刀尖点跟随技术详解
c++·机器人·操作系统·嵌入式·c·数控·机床
消失的旧时光-194312 天前
函数指针 + 结构体 = C 语言的“对象模型”?——从 C 到 C++ / Java 的本质统一
linux·c语言·开发语言·c++·c
埃伊蟹黄面13 天前
ELF深入解剖:从文件头到动态段,图解库的二进制构成
linux·c·
REDcker13 天前
AIGCJson 库解析行为与异常处理指南
c++·json·aigc·c