【重生之我在学习C语言指针详解】

news/2025/1/31 22:35:53/

目录

​编辑

--------------------------------------begin----------------------------------------

引言

一、指针基础

1.1 内存地址

1.2 指针变量

1.3 指针声明

1.4 取地址运算符 &

1.5 解引用运算符 ***

二、指针运算

2.1 指针加减运算

2.2 指针关系运算

三、指针与数组

3.1 数组名作为指针

3.2 指针遍历数组

四、指针与函数

4.1 指针作为函数参数

4.2 指针作为函数返回值

五、指针高级应用

5.1 指针数组

5.2 指向指针的指针

5.3 函数指针

六、指针使用注意事项

七、总结

--------------------------------------end------------------------------------------


--------------------------------------begin----------------------------------------

引言

指针是C语言的灵魂,它赋予了C语言直接操作内存的能力,使得C语言在系统编程、嵌入式开发

等领域大放异彩。然而,指针也是C语言中最难理解的概念之一,让许多初学者望而生畏。本文将

深入浅出地讲解C语言指针,帮助你彻底掌握这一重要概念。

一、指针基础

1.1 内存地址

计算机的内存被划分为一个个字节,每个字节都有一个唯一的编号,称为内存地址。我们可以把内

存想象成一个巨大的数组,每个元素都是一个字节,而内存地址就是数组的下标。

1.2 指针变量

指针变量是一种特殊的变量,它存储的不是数据本身,而是数据的内存地址。我们可以通过指针变

量来间接访问和操作内存中的数据。

1.3 指针声明

指针变量的声明需要指定它所指向的数据类型,例如:

int *p;  // 声明一个指向int类型数据的指针变量p
char *c; // 声明一个指向char类型数据的指针变量c

1.4 取地址运算符 &

我们可以使用取地址运算符 & 来获取变量的内存地址,例如:

int a = 10;
int *p = &a; // 将变量a的地址赋值给指针变量p

1.5 解引用运算符 ***

我们可以使用解引用运算符 * 来访问指针变量所指向的内存地址中的数据,例如:

int a = 10;
int *p = &a;
printf("%d\n", *p); // 输出10

二、指针运算


2.1 指针加减运算

指针可以进行加减运算,加减的单位是指针所指向数据类型的大小。例如:

int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;
p++; // p指向arr[1]
p += 2; // p指向arr[3]

2.2 指针关系运算

指针可以进行关系运算,比较两个指针所指向的内存地址的大小。例如:

int arr[5] = {1, 2, 3, 4, 5};
int *p1 = arr;
int *p2 = arr + 3;
if (p1 < p2) {printf("p1 points to a lower memory address than p2\n");
}

三、指针与数组

3.1 数组名作为指针

数组名本质上是一个指向数组第一个元素的指针常量。例如:

int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // p指向arr[0]

3.2 指针遍历数组

我们可以使用指针来遍历数组,例如:

int arr[5] = {1, 2, 3, 4, 5};
int *p = arr;
for (int i = 0; i < 5; i++) {printf("%d ", *p);p++;
}

四、指针与函数

4.1 指针作为函数参数

我们可以将指针作为函数参数传递,这样函数就可以直接修改实参的值。例如:

void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}int main() {int x = 10, y = 20;swap(&x, &y);printf("x = %d, y = %d\n", x, y); // 输出x = 20, y = 10return 0;
}

4.2 指针作为函数返回值

我们可以将指针作为函数返回值,例如:

int *create_array(int size) {int *arr = (int *)malloc(size * sizeof(int));return arr;
}

五、指针高级应用

5.1 指针数组

指针数组是指数组中的每个元素都是一个指针。例如:

int *arr[5]; // 声明一个包含5个int类型指针的数组

5.2 指向指针的指针

我们可以声明指向指针的指针,例如:

int a = 10;
int *p = &a;
int **pp = &p; // pp指向p,p指向a

5.3 函数指针

函数指针是指向函数的指针,例如:

int add(int a, int b) {return a + b;
}int (*p)(int, int) = add; // p指向add函数
int result = p(1, 2); // 调用add函数

六、指针使用注意事项

  • 野指针 指向未知内存地址的指针称为野指针,使用野指针会导致程序崩溃。

  • 内存泄漏: 使用 malloc 等函数动态分配内存后,需要使用 free 函数释放内存,否则会导致内存泄漏。

  • 指针类型转换: 不同类型的指针之间不能直接赋值,需要进行强制类型转换。

七、总结

指针是C语言中非常重要的概念,掌握指针的使用可以让你编写出更高效、更灵活的程序。希望本

文能够帮助你理解指针的本质,并能够在实际编程中灵活运用指针。

--------------------------------------end------------------------------------------

路过的佬们点点关注哦~

你们的鼓励才是我前进的动力


http://www.ppmy.cn/news/1568257.html

相关文章

PhotoShop中JSX编辑器安装

1.使用ExtendScript Tookit CC编辑 1.安装 打开CEP Resource链接&#xff1a; CEP-Resources/ExtendScript-Toolkit at master Adobe-CEP/CEP-Resources (github.com) 将文件clone到本地或者下载到本地 点击AdobeExtendScriptToolKit_4_Ls22.exe安装&#xff0c;根据弹出的…

Python爬虫学习第三弹 —— Xpath 页面解析 实现无广百·度

早上好啊&#xff0c;大佬们。上回使用 Beautiful Soup 进行页面解析的内容是不是已经理解得十分透彻了~ 这回我们再来尝试使用另外一种页面解析&#xff0c;来重构上一期里写的那些代码。 讲完Xpath之后&#xff0c;小白兔会带大家解决上期里百度搜索的代码编写&#xff0c;保…

智能家居监控系统数据收集积压优化

亮点&#xff1a;RocketMQ 消息大量积压问题的解决 假设我们正在开发一个智能家居监控系统。该系统从数百万个智能设备&#xff08;如温度传感器、安全摄像头、烟雾探测器等&#xff09;收集数据&#xff0c;并通过 RocketMQ 将这些数据传输到后端进行处理和分析。 在某些情况下…

实现B-树

一、概述 1.历史 B树&#xff08;B-Tree&#xff09;结构是一种高效存储和查询数据的方法&#xff0c;它的历史可以追溯到1970年代早期。B树的发明人Rudolf Bayer和Edward M. McCreight分别发表了一篇论文介绍了B树。这篇论文是1972年发表于《ACM Transactions on Database S…

通过 NAudio 控制电脑操作系统音量

根据您的需求&#xff0c;以下是通过 NAudio 获取和控制电脑操作系统音量的方法&#xff1a; 一、获取和控制系统音量 &#xff08;一&#xff09;获取系统音量和静音状态 您可以使用 NAudio.CoreAudioApi.MMDeviceEnumerator 来获取系统默认音频设备的音量和静音状态&#…

DeepSeek-R1:通过强化学习激励大型语言模型(LLMs)的推理能力

摘要 我们推出了第一代推理模型&#xff1a;DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero是一个未经监督微调&#xff08;SFT&#xff09;作为初步步骤&#xff0c;而是通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;展现出卓越的推理能力。通过强…

组合模式 - 组合模式的实现

引言 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和组合对象&#xff0c;从而简化了代码的复杂性。本文将详细介绍如何在C中实…

Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具)

redis实现查询缓存的业务逻辑 service层实现 Overridepublic Result queryById(Long id) {String key CACHE_SHOP_KEY id;// 现查询redis内有没有数据String shopJson (String) redisTemplate.opsForValue().get(key);if(StrUtil.isNotBlank(shopJson)){ // 如果redis的数…