C 语言指针完全指南:创建、解除引用、指针与数组关系解析

本文涉及的产品
性能测试 PTS,5000VUM额度
注册配置 MSE Nacos/ZooKeeper,118元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 创建指针我们可以使用引用运算符 & 获取变量的内存地址:

C 语言中的指针

创建指针

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

int myAge = 43; // 一个 int 变量

printf("%d", myAge); // 输出 myAge 的值 (43)
printf("%p", &myAge); // 输出 myAge 的内存地址 (0x7ffe5367e044)

指针是一个将另一个变量的内存地址作为其值的变量。

指针变量指向一个数据类型(如 int)的相同类型,并使用 * 运算符创建。您正在使用的变量的地址被分配给指针:

int myAge = 43; // 一个 int 变量
int* ptr = &myAge; // 一个名为 ptr 的指针变量,存储 myAge 的地址

// 输出 myAge 的值 (43)
printf("%d\n", myAge);

// 输出 myAge 的内存地址 (0x7ffe5367e044)
printf("%p\n", &myAge);

// 使用指针输出 myAge 的内存地址 (0x7ffe5367e044)
printf("%p\n", ptr);

示例解释:

  • 创建一个名为 ptr 的指针变量,指向一个 int 变量 (myAge)。请注意,指针的类型必须与您正在使用的变量的类型匹配(本例中为 int)。
  • 使用 & 运算符将 myAge 变量的内存地址存储并分配给指针。
  • 现在,ptr 存储了 myAge 的内存地址值。

解除引用

在上面的示例中,我们使用指针变量来获取变量的内存地址(与 & 引用运算符一起使用)。

您还可以通过使用 * 运算符(取消引用运算符)获取指针指向的变量的值:

int myAge = 43; // 变量声明
int* ptr = &myAge; // 指针声明

// 引用:使用指针输出 myAge 的内存地址 (0x7ffe5367e044)
printf("%p\n", ptr);

// 解除引用:使用指针输出 myAge 的值 (43)
printf("%d\n", *ptr);

请注意,* 符号在这里可能会让人困惑,因为它在我们的代码中做了两件事:

  • 当用于声明 (int* ptr) 时,它会创建一个指针变量。
  • 当不用于声明时,它充当取消引用运算符。

值得注意:在 C 语言中声明指针变量有两种方法:

int* myNum;
int *myNum;

关于指针的注意事项:

  • 指针是 C 语言区别于其他编程语言(如 Python 和 Java)的一大特点。
  • 它们在 C 语言中很重要,因为它们允许我们操作计算机内存中的数据。这可以减少代码量并提高性能。如果您熟悉像列表、树和图这样的数据结构,您应该知道指针对于实现它们特别有用。有时您甚至必须使用指针,例如在处理文件时。
  • 但是要小心; 指针必须谨慎处理,因为有可能损坏存储在其他内存地址的数据。

C 语言中的指针和数组

您也可以使用指针访问数组。

考虑以下整数数组

int myNumbers[4] = {
   25, 50, 75, 100};
int i;

for (i = 0; i < 4; i++) {
   
  printf("%d\n", myNumbers[i]);
}

结果:

25
50
75
100

让我们尝试打印每个数组元素的内存地址,而不是打印每个数组元素的值:

int myNumbers[4] = {
   25, 50, 75, 100};
int i;

for (i = 0; i < 4; i++) {
   
  printf("%p\n", &myNumbers[i]);
}

结果:

0x7ffe70f9d8f0
0x7ffe70f9d8f4
0x7ffe70f9d8f8
0x7ffe70f9d8fc

请注意,每个元素的内存地址的最后一位数字都不同,增加了 4。

这是因为 int 类型的大小通常为 4 个字节,请记住:

// 创建一个 int 变量
int myInt;

// 获取一个 int 的内存大小
printf("%lu", sizeof(myInt));

结果:4

因此,从上面的“内存地址示例”中,

您可以看到编译器为每个数组元素预留了 4 个字节的内存,这意味着整个数组占用 16 个字节(4 * 4)的内存存储空间:

int myNumbers[4] = {
   25, 50, 75, 100};

// 获取 myNumbers 数组的大小
printf("%lu", sizeof(myNumbers));

结果:16

指针与数组的关系

好的,那么指针和数组之间有什么关系呢?好吧,在 C 语言中,数组的名称实际上是指向数组第一个元素的指针。

感到困惑?让我们试着更好地理解这一点,并再次使用上面的“内存地址示例”。

第一个元素的内存地址与数组的名称相同:

int myNumbers[4] = {
   25, 50, 75, 100};

// 获取 myNumbers 数组的内存地址
printf("%p\n", myNumbers);

// 获取第一个数组元素的内存地址
printf("%p\n", &myNumbers[0]);

结果:

0x7ffe70f9d8f0
0x7ffe70f9d8f0

这基本上意味着我们可以通过指针来操作数组!

怎么操作呢?由于 myNumbers 是指向 myNumbers 中第一个元素的指针,因此您可以使用 * 运算符来访问它:

int myNumbers[4] = {
   25, 50, 75, 100};

// 获取 myNumbers 中第一个元素的值
printf("%d", *myNumbers);

结果:25

要访问 myNumbers 中的其他元素,您可以增加指针/数组(+1、+2 等):

int myNumbers[4] = {
   25, 50, 75, 100};

// 获取 myNumbers 中的第二个元素的值
printf("%d\n", *(myNumbers + 1));

// 获取 myNumbers 中的第三个元素的值
printf("%d", *(myNumbers + 2));

// 等等..

结果:

50
75

或者循环遍历它:

int myNumbers[4] = {
   25, 50, 75, 100};
int *ptr = myNumbers;
int i;

for (i = 0; i < 4; i++) {
   
  printf("%d\n", *(ptr + i));
}

结果:

25
50
75
100

您也可以使用指针更改数组元素的值:

int myNumbers[4] = {
   25, 50, 75, 100};

// 将第一个元素的值改为 13
*myNumbers = 13;

// 将第二个元素的值改为 17

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

相关文章
|
2天前
|
存储 监控 算法
探秘员工泄密行为防线:基于Go语言的布隆过滤器算法解析
在信息爆炸时代,员工泄密行为对企业构成重大威胁。本文聚焦布隆过滤器(Bloom Filter)这一高效数据结构,结合Go语言实现算法,帮助企业识别和预防泄密风险。通过构建正常操作“指纹库”,实时监测员工操作,快速筛查可疑行为。示例代码展示了如何利用布隆过滤器检测异常操作,并提出优化建议,如调整参数、结合日志分析系统等,全方位筑牢企业信息安全防线,守护核心竞争力。
|
2月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
124 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
2月前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
109 1
|
2月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
179 9
|
2月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
64 7
|
2月前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
186 6
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5
|
3月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
3月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
72 1
|
1月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
62 23

推荐镜像

更多