C语言指针初识
2026/7/22 7:18:29 网站建设 项目流程

1.指针的概念

类比其他的数据类型

整型:用来存放整型数

浮点型:用来存放浮点数

字符型:用来存放字符

指针:是用来存放地址的一种类型

2.指针的大小

根据操作平台的位数相同,32位平台的话指针就是32位的;64位平台就是64位的

3.创建指针

int * point

所有的创建变量都可以看成是 type 变量名

对于指针来说

type -- > int *:这个是一个指针,它指向的地址用分析整型int的方式来处理

变量名 --- > point:这个是指针的名字

当你想要修改某个地址的数值时,你就需要先将这块地址给过去,然后再在地址上面修改里面的数据

#include <stdio.h> void func(int *ret) { *ret = 20; //这里的ret是指针,要通过解析指针才能对其赋值 } int main(void) { int ret = 10; int *point = &ret; //让指针指向这块地址 func(point); //通过指针将地址传入函数中,这样在函数内的操作就能够修改ret的值了 printf("%d", ret); }

在为数据赋值时,要遵顼几个原则

  1. 常量(包括数组名、字面量)不能被赋值

  2. 赋值号左右两边的数据类型要相同(或兼容)

  3. 赋值号左边必须是可修改的左值(有明确内存地址的变量)

    不可修改的:1.数组名 int buf[10] = {0}; buf++; ❌(但是可以 buf + 1)

    2.常量 3 = 4 ❌

    3.表达式 (a + b) = 4 ❌

  4. 类型不同时会隐式转换,注意大转小会截断丢失数据

  5. 指针类型必须严格匹配,除非使用强制类型转换

  6. 结构体可以直接赋值,但数组不能整体赋值

对于第三点补充一下

数组名是不能进行偏移的,但是指针是可以

#include <stdio.h> int main(void) { int num_buf[10] = {1,2,3,4,5}; int * p_num = num_buf; //num_buf++ 错误操作 printf("%d\n", &p_num); p_num++; //规范操作 printf("%d\n", &p_num); }

4.指针支持减运算以及比较符(同类型的前提下)

#include <stdio.h> int main(void) { int *p, *q; p = mallo(100); //申请100个字节大小的内存 q = p + 2; //q是指向p偏移2个int(8个字节)地址后的位置 q - p; //可以得到q和p之间隔了多少个int类型(不是字节) printf("q和p相差%ld\n", q - p); q > p; //值为True if(q > p) printf("q的地址比p的地址高"); }

⚠️注意:指针仅支持上述两种(减运算和比较),并且是在同类型指针的前提下,不支持其他的运算符

5.指针的应用场景

  1. 优化大块数据的传参效率:避免对大结构体或数组进行拷贝,仅传递其地址,从而减少内存开销并提升性能。

  2. 动态内存分配:配合mallocfree等函数管理堆内存,实现运行时灵活的内存申请与释放。

  3. 实现动态数据结构:用于构建链表、树、图等数据结构中节点之间的连接关系。

  4. 实现多返回值:通过指针参数,使函数能够间接返回多个结果值。

  5. 操作硬件或显存:通过mmap等系统调用将物理地址映射到进程空间,从而用指针直接读写设备内存。

  6. 高效处理字符串和数组:通过指针算术运算直接遍历和操作内存中的连续数据,提升处理效率。

  7. 实现回调机制(函数指针):将函数地址作为参数传递,实现回调功能,增强代码的模块化与灵活性。

这些在后续的指针使用中都是非常实用且强大的功能

6.其他类型的指针

1.野指针

其实就是创建后没有赋初值的指针,没有明确的指向

⚠️注意:不能操作野指针,有内存越界的风险,程序容易出现问题

2.NULL指针

NULL指针其实就是内存里面的第0位,为了防止野指针,我们可以在创建指针的时候先为其赋值为NULL int * point = NULL;

3.悬空指针

当通过malloc申请了一块地址,通过free释放后的指针就是悬空指针,此时这个指针跟野指针一样危险,在后续程序如果还使用这个指针的话就会出现错误,此时推荐在free后立刻给其赋值为NULL

#include <stdio.h> #include <stdlib.h> int main(void) { int *p = NULL; //创建的指针如果没确定好初值,可以先赋值为NULL p = malloc(100); //为其申请100个字节的内存 free(p); //释放这片内存,此时p变成了悬空指针 p = NULL; //为其设置为NULL,防止后续错误调用导致程序出问题 }

总结就是在创建时为指针设为NULL,使用后也为其设为NULL,这样就不容易出现问题

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询