写点什么

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

作者:小万哥
  • 2024-01-05
    广东
  • 本文字数:2044 字

    阅读完需:约 7 分钟

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

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]);}
复制代码


结果:


255075100
复制代码


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


int myNumbers[4] = {25, 50, 75, 100};int i;
for (i = 0; i < 4; i++) { printf("%p\n", &myNumbers[i]);}
复制代码


结果:


0x7ffe70f9d8f00x7ffe70f9d8f40x7ffe70f9d8f80x7ffe70f9d8fc
复制代码


请注意,每个元素的内存地址的最后一位数字都不同,增加了 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]);
复制代码


结果:


0x7ffe70f9d8f00x7ffe70f9d8f0
复制代码


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


怎么操作呢?由于 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));
// 等等..
复制代码


结果:


5075
复制代码


或者循环遍历它:


int myNumbers[4] = {25, 50, 75, 100};int *ptr = myNumbers;int i;
for (i = 0; i < 4; i++) { printf("%d\n", *(ptr + i));}
复制代码


结果:


255075100
复制代码


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


int myNumbers[4] = {25, 50, 75, 100};
// 将第一个元素的值改为 13*myNumbers = 13;
// 将第二个元素的值改为 17
复制代码

最后

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


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


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

发布于: 刚刚阅读数: 3
用户头像

小万哥

关注

代码如人生 2023-02-09 加入

编程爱好者

评论

发布
暂无评论
C 语言指针完全指南:创建、解除引用、指针与数组关系解析_程序人生_小万哥_InfoQ写作社区