当前位置: 首页 > news >正文

C语言学习笔记(十)——指针基础与数组指针应用

一、指针的概念

1. 什么是地址

计算机中的变量都存储在内存空间中。

为了区分不同的内存空间,计算机会给每一个存储单元分配一个编号,这个编号就是:地址

int num = 10;

变量num在内存中有自己的存储空间,同时也具有对应的地址。

可以通过:

&num

获取变量num的地址。


二、什么是指针

指针可以理解为:

存储地址的变量。

普通变量保存的是数据:

int num = 10;

而指针变量保存的是地址:

int *p;

例如:

int num = 10; int *p; p = #

此时:

num 10 p num的地址

指针变量p指向变量num


三、指针变量定义

指针变量定义格式:

数据类型 *变量名;

例如:

int *p; char *str; double *q;

不同类型的指针表示:

  • int *:指向整型数据

  • char *:指向字符型数据

  • double *:指向双精度数据


四、指针相关运算符

C语言中指针主要涉及两个运算符:

1. 取地址运算符&

作用:

获取变量在内存中的地址。

示例:

#include <stdio.h> int main() { int num = 100; printf("%p\n",&num); return 0; }

输出:

0x7ffdxxxx

2. 取值运算符*

作用:

通过地址访问对应空间中的数据。

示例:

#include <stdio.h> int main() { int num = 100; int *p; p=&num; printf("%d\n",*p); return 0; }

运行结果:

100

其中:

*p

表示访问指针指向空间中的数据。


五、指针变量案例

通过指针修改变量值:

#include <stdio.h> int main() { int num = 10; int *p; p=&num; *p=100; printf("num=%d\n",num); return 0; }

运行结果:

num=100

说明:

通过指针可以直接修改变量所在内存空间的数据。


六、野指针与空指针

1. 野指针

野指针:

未初始化或者指向已经释放空间的指针。

例如:

int *p;

此时p没有明确指向。

错误使用:

*p=10;

可能导致程序异常。

因此:

不要使用未经初始化的指针。


2. 空指针

空指针:

指向地址0x0的指针。

定义:

int *p=NULL;

例如:

int *p=NULL; *p=10;

由于空地址不可访问,会导致程序崩溃。


七、指针运算

指针支持部分算术运算。

例如:

p++;

表示:

指针向高地址方向移动一个数据类型大小。

如果:

int *p;

执行:

p++;

地址会增加:

sizeof(int)

个字节。


八、指针作为函数参数

之前学习函数参数传递时,值传递无法修改外部变量:

void change(int a) { a=100; }

调用后:

外部变量不会改变。


如果希望修改外部变量,需要使用地址传递。

示例:

#include <stdio.h> void change(int *p) { *p=100; } int main() { int num=10; change(&num); printf("%d\n",num); return 0; }

运行结果:

100

原因:

函数接收的是变量地址,通过指针修改原变量。


九、一维数组与指针关系

C语言中:

数组名可以理解为指向数组第一个元素的指针。

例如:

int a[5]={1,2,3,4,5};

定义指针:

int *p; p=a;

等价于:

p=&a[0];

十、数组元素访问与指针

数组访问:

a[2]

等价于:

*(a+2)

也等价于:

*(p+2)

还可以写:

p[2]

例如:

#include <stdio.h> int main() { int a[5]={10,20,30,40,50}; int *p=a; printf("%d\n",*(p+2)); return 0; }

输出:

30

十一、一维数组传参

数组作为函数参数时:

可以传递:

int fun(int array[],int len);

也可以写:

int fun(int *array,int len);

两种形式效果相同。


十二、利用指针封装冒泡排序

利用数组指针,可以封装排序函数:

#include <stdio.h> void BubbleSort(int *p,int len) { int i,j,tmp; for(i=0;i<len-1;i++) { for(j=0;j<len-1-i;j++) { if(p[j]>p[j+1]) { tmp=p[j]; p[j]=p[j+1]; p[j+1]=tmp; } } } } int main() { int a[5]={5,3,8,1,2}; BubbleSort(a,5); for(int i=0;i<5;i++) { printf("%d ",a[i]); } return 0; }

运行结果:

1 2 3 5 8

结语

指针是 C 语言学习过程中一个重要的分水岭。相比之前学习的变量和数组,指针更加接近计算机底层,可以直接操作内存地址。:虽然指针初学时理解起来比较困难,但掌握指针之后,可以编写更加灵活、高效的程序。

http://www.jsqmd.com/news/1304918/

相关文章:

  • 什么是三维数字沙盘?
  • 人害怕未知:本质是不知道下一步在哪里。
  • 豆包多轮意图漂移难题如何破局:从BERT-Whitening到动态对话图谱的5阶演进路径
  • 串口通信实战:从硬件连接到协议设计,打通电脑间数据传输
  • 进程间通信(IPC)核心机制解析与实战选型指南
  • 亲测合规\踩雷,体制内写稿效率翻倍
  • Verilog异或运算实战:格雷码、奇偶校验与奇数分频
  • 什么是 CSS?
  • 毕业论文终检前夕,如何快速搞定高重灾区与AI嫌疑句?
  • 一个人做多个公众号矩阵:如何优雅地规避平台的“一锅端”风险?
  • 2026年ES柜源头实力工厂甄选:五折柜/电控柜/控制柜/配电柜供应厂家全解析 - 优企名品
  • 【新闻】687个!本周艾为官网新增6个应用方案
  • 彻底解决Python文件读取UnicodeDecodeError:从编码原理到实战方案
  • 电机控制技术解析:从FOC到DTC,深入理解磁场定向与直接转矩控制
  • 醴陵市外墙漏水怎么处理_2026湖南东部湘东丘陵城市漏水维修流程教程与精选 - 雨婺虹房屋维修
  • 2026年聚醚消泡剂厂家实力排行榜,水性涂料/发酵/工业清洗专用聚醚消泡剂源头工厂精选推荐! - 优企名品
  • 如何在Obsidian中轻松管理电子表格?终极Excel插件完全指南
  • DedeCMS文件上传漏洞深度修复:从代码加固到服务器防线的三层防御方案
  • 8月更新:ChatGPT Pro、Plus 与 Codex 如何改变软件产品从想法到落地的速度(GPT-5.6与AI产品工程技术分享)
  • 告别“小助手”!乐享、擎天再升级,联想让AI“下场干活”
  • STM32CubeIDE调试失败:GDB服务器启动错误排查全攻略
  • Matlab txt数据导入与可视化:科研论文高效出图全流程指南
  • MP4Box.js:浏览器端MP4处理的革命性突破
  • 盗版设计软件的真实代价:数据安全、效率与法律风险全解析
  • PLC项目实战:从核心角色到技术栈的工业自动化实践指南
  • 2026实力之选:东莞市健驰不锈钢饰品有限公司——百搭首饰产业带源头工厂的价值锚点 - 优企名品
  • 数宠科技服务口碑怎么样 - mypinpai
  • 10款AI降重工具测评:学术论文改写效果对比
  • VB编程基础:变量命名、数据类型与声明方法详解
  • Python数据科学实战:从数据清洗到模型部署的完整指南