定义与赋值 | C指针基础(一)

发布时间:2026/10/4 18:54:55
定义与赋值 | C指针基础(一) C指针基础一什么是指针指针的意义为什么要多此一举总结定义指针变量基本格式为什么定义指针时需要指定类型名指针变量的赋值与*辨析pa、*pa 与 pa什么是指针指针说白了就是内存的门牌号。想象一下你住在一栋叫内存的大楼里每个房间都有一个门牌号。你想去朋友家串门光知道我朋友住在这栋楼里可没用——你得知道具体是几号房才能敲对门。在 C 语言里变量就是房间变量的值就是房间里住的人而指针就是那个门牌号——它告诉你这个变量住在内存的哪个地址。比如你写inta42;scanf(%d,a);这里的a就是取 a 的门牌号也就是 a 在内存中的地址。scanf拿到这个门牌号才能找到 a 的房间把用户输入的数字塞进去。如果你不给它门牌号只给它a的值比如 42那scanf就懵了“你给我个数字干嘛我要的是地址啊”指针的意义为什么要多此一举你可能会问“我直接用变量不就行了干嘛非要搞个指针”问得好指针的意义主要体现在三个场景1. 函数想改你的变量C 语言函数传参默认是值传递——你把a的值复制一份给函数函数改的是副本原变量纹丝不动。想让函数真正修改外面的变量就得把a门牌号传进去函数顺着门牌号找到原房间直接改。2. 动态内存管理程序运行时才知道要多大数组那就用malloc在堆上申请一块内存返回一个指针。指针就是这块内存的钥匙没有它你申请的内存就找不回来了。3. 高效传递大数据传一个巨大的结构体给函数如果按值传递得把整个结构体复制一份又慢又费内存。传指针就只传一个门牌号轻装上阵效率拉满。总结指针就是内存地址的化身它让你能直接按图索骥找到数据、修改数据、管理内存。虽然刚学时觉得绕但一旦掌握你会发现它其实是 C 语言最锋利的武器。定义指针变量指针变量是专门用于存放内存地址的变量。普通变量保存的是数据值而指针变量保存的是某个数据对象在内存中的地址。基本格式类型名*指针变量名;类型名表示该指针所指向的数据类型可以是int、float、char等基本类型也可以是结构体等自定义类型。*表明该变量是一个指针变量。指针变量名指针变量的名称遵循 C 语言标识符命名规则。例如int*p1;// p1 是指向 int 类型数据的指针float*p2;// p2 是指向 float 类型数据的指针char*p3;// p3 是指向 char 类型数据的指针以上都是合法的指针变量定义。需要注意星号*靠近变量名书写表示该变量是指针。若一次定义多个指针变量每个变量名前都必须带星号int*pa,*pb;// pa 和 pb 都是指针变量int*pc,d;// pc 是指针变量d 是普通 int 变量为什么定义指针时需要指定类型名指针变量存储的是地址但仅凭地址信息并不足以正确操作内存中的数据。类型名决定了两个关键方面1. 解引用时读取的字节数*p表示解引用操作即根据指针中保存的地址读取对应内存中的数据。一个int类型通常占 4 个字节而char类型占 1 个字节。若编译器不知道指针所指的类型就无法确定解引用时应读取多少个字节可能导致读取数据不完整或越界。2. 指针运算时的步长指针支持算术运算例如p 1。如果p是int *类型p 1的地址偏移量为 4 个字节恰好指向下一个int数据如果p是char *类型则偏移量仅为 1 个字节。只有明确指针的类型编译器才能正确计算指针运算的步长。指针变量的赋值指针变量与int、float等普通数据类型一样声明之后必须赋予一个合法的地址值。若声明后未初始化指针变量会保存一个不确定的地址值成为野指针后续解引用时可能引发未定义行为。指针变量可以在声明的同时初始化。需要特别注意的是赋给指针变量的值必须是地址而不是变量值。例如inta10;int*paa;// 声明时初始化pa 保存变量 a 的地址也可以先声明指针变量再单独赋值inta10;int*pa;// 先声明指针变量paa;// 再赋值赋的是变量 a 的地址 a在使用指针时必须严格区分pa与*papa是指针变量本身保存的是地址值例如a。*pa是解引用操作表示pa所指向的那个对象也就是变量a本身。对*pa的读写等价于对a的读写。int*pa;paa;// 给指针变量 pa 赋值赋的是地址*paa;// *pa 等价于 a此句演示 *pa 与 a 表示同一个对象与*与*是和指针紧密相关的两个单目运算符是取地址运算符用于获取某个变量在内存中的地址。*是解引用运算符用于通过地址访问该地址所指向的对象。典型用法如下inta10;int*paa;// a 取得 a 的地址pa 保存该地址*pa20;// *pa 根据 pa 中的地址找到 a并修改 a 的值上述代码中*pa 20;与a 20;作用相同。辨析pa、*pa 与 pa在指针表达式中pa、*pa、pa三个写法只差一个符号但含义完全不同。理解它们的区别是熟练使用指针的关键。先看一段完整示例inta100;int*paa;// pa 保存变量 a 的地址*pa200;// 通过 pa 修改 a此时 a 的值变为 200printf(%d\n,pa);// 输出 pa 保存的地址值也就是 aprintf(%d\n,*pa);// 解引用输出 a 的值即 200printf(%d\n,pa);// 输出指针变量 pa 自身的地址运行结果从运行结果可以看出pa、*pa、pa三者的数据并不相同可以这样区分pa指针变量本身它的值是变量a的地址即a。*pa解引用操作表示pa所指向的对象在这里就等价于a因此*pa 200实际是把a改成了200。pa取指针变量pa自己的地址。注意它和a的地址没有关系而是pa这个变量在内存中的存放位置。换句话说pa是“门牌号”*pa是“照着门牌号找到的房间”而pa是“存放这张门牌号的位置”。