恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
C学习笔记(十一):指针详解
首页
资讯中心
/
C学习笔记(十一):指针详解
C学习笔记(十一):指针详解
发布时间:2026/8/1 5:57:51
一、为什么需要指针普通变量保存的是数据本身。例如int a 10;变量a中保存10但是计算机在内存中存储数据时每个数据都有自己的存储位置。例如内存 地址 数据 0x1000 10其中10是数据0x1000是数据存储的位置。这个位置称为地址。指针的作用通过地址直接访问内存空间。因此指针可以让程序更高效更灵活更方便地操作内存。二、内存地址1. 什么是地址计算机为了区分不同的内存空间会给每个内存空间编号。这个编号就是内存地址。例如地址 数据 1000 20 1004 30程序通过地址找到对应的数据。2. 内存按字节编址计算机中的内存按字节进行编号。例如0x0000 0x0001 0x0002 0x0003 ...每一个地址对应一个字节空间。三、指针的概念1. 什么是指针指针可以理解为地址。地址就是指针。例如变量int a 10;假设a所在地址 0x1000那么0x1000就是变量a的指针。2. 指针变量用于保存地址的变量称为指针变量。例如int *p;表示定义一个指向int类型数据的指针变量p。关系普通变量 a ↓ 保存数据10 指针变量 p ↓ 保存地址0x1000四、取地址运算符 1. 功能获取变量的地址。例如int num 10; printf(%p,num);输出num的地址2. 使用规则只有左值才能进行取地址操作。例如正确a错误10原因常量没有存储空间。3. 类型变化例如int a;a类型int执行a之后类型变为int *即int类型指针。五、取值运算符 *1. 功能*根据地址访问对应空间的数据。例如int a10; int *pa;此时p ↓ a的地址使用*p表示访问a中的数据。结果102. 修改变量值例如int a10; int *pa; *p20;执行后a变为20原因*p代表p指向的空间。3. 类型变化例如int *p;执行*p类型int即指针类型降级。六、指针变量定义格式数据类型 *变量名;例如int *p; char *q; float *r; double *s;表示不同类型的指针。指针变量大小无论什么类型int * char * float * double *指针变量本身大小都是8字节因为保存的是地址。七、野指针1. 什么是野指针野指针未初始化的指针或者指向已经释放空间的指针。例如int *p; *p10;此时p没有指向有效空间。程序可能崩溃。2. 如何避免定义指针后不要直接使用。应该int a; int *pa;或者int *pNULL;八、空指针 NULL空指针指向地址0的指针。例如int *pNULL;表示p暂时不指向任何有效空间。注意不能*p10;因为NULL地址不可访问。会导致程序崩溃。九、指针类型不同类型指针int *p; char *p; float *p; double *p;区别指向空间的数据类型不同。例如int *p;表示p指向4字节整数空间。十、指针的算术运算指针支持指针相减1. 指针例如int *p; p;不是增加1字节。而是增加sizeof(int)个字节。例如int占4字节地址 1000 ↓ 10042. 指针--类似向低地址移动。3. 指针相减例如p1-p2得到两个地址之间相差多少个元素。十一、指针操作指针有两种操作方式。1. 修改指针本身例如pb;改变p的指向。2. 修改指针指向的数据例如*p100;改变指向空间中的值。示例int a100; int b200; int *pa; pb;改变p指向b。而*p300;改变b的值。十二、指针作为函数参数前面学习函数传参默认是值传递。1. 值传递例如void change(int a) { a100; }调用int x10; change(x);结果x仍然是10因为形参只是副本。2. 地址传递如果想修改外部变量需要传地址。例如void change(int *p) { *p100; }调用int x10; change(x);执行后x100地址传递作用修改函数外部变量一个函数返回多个结果。十三、数组与指针关系C语言中数组名本质上是指向数组第一个元素的指针常量。例如int a[5]{1,2,3,4,5};数组名a等价于a[0]例如int *pa;表示p指向数组第一个元素。访问a[2]等价于*(a2)也等价于*(p2)十四、一维数组指针传参数组作为函数参数例如int fun(int array[],int len);等价于int fun(int *array,int len);示例冒泡排序函数void BubbleSort(int *array,int len) { }调用BubbleSort(a,10);数组地址传入函数。注意数组传参时函数中操作的数组和外部数组是同一个空间。因此可以直接修改数组内容。