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

小万哥
• 阅读 167

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年前
C语言中指针及其应用基础篇(指针变量,指针和数组)
一、指针变量1.1代码分析先把代码贴上来进行分析。笔者在写代码时候会加上头文件stdlib和代码system("pause");这是为了防止闪屏,在学校时候老师有教过其他写法,但是还是觉得笔者这样写比较容易记得住。cinclude<stdio.hinclude<stdlib.hintmain()intvar20;intp;//定义指针变
Kevin501 Kevin501
3年前
Go语言中new()和make()的区别
1.Go语言中的值类型和引用类型值类型:int,float,bool,string,struct和数组(数组要特别注意,别搞混了)变量直接存储值,分配栈区的内存空间,这些变量所占据的空间在函数被调用完后会自动释放。引用类型:slice,map,chan和值类型对应的指针变量存储的是一个地址(或者理解为指针),指针指向内存中真
Wesley13 Wesley13
2年前
C++:指针和引用
引用的概念及用法 所谓的引用并不是说重新定义的一个新的变量,而是给一个已经定义好了的变量起的一个别名。 下面看看引用到底是如何使用的:voidtest1(){  inta1;  int&ba;//引用变量b是a的别名  std::cout<<"a:address"<<&a<<std::
Wesley13 Wesley13
2年前
C++学习(十八)(C语言部分)之 指针2
指针1、指针的概述指针是什么?指针是一个地址是一个常量int整型intaa是变量指针用来做什么?方便使用数组或者字符串像汇编语言一样处理内存地址2、指针变量什么是指针变量?是一个可以存储地址的一个“容器”经常会吧指针变量读作指针后面吧地址当做“指针”吧存储地址的变量叫做“指针变量”
Stella981 Stella981
2年前
Golang教程:指针
什么是指针指针是存储一个变量的内存地址的变量。  !(https://oscimg.oschina.net/oscnet/70c3337580dba5f227a4b71b2f73d6ba527.png)在上图中,变量 b 的值是 156,存储在地址为 0x1040a124 的内存中。变量 a 存储了变量 b 的
小万哥 小万哥
2星期前
C++ 解引用与函数基础:内存地址、调用方法及声明
C解引用获取内存地址和值在上一页的示例中,我们使用了指针变量来获取变量的内存地址(与引用运算符&一起使用)。但是,你也可以使用指针来获取变量的值,这可以通过使用运算符(解引用运算符)来实现:cstringfood"Pizza";//变量声明stri
九路 九路
1年前
C++之值传递&指针传递&引用传递详解
C之值传递&指针传递&引用传递详解目录C之值传递&指针传递&引用传递详解(about:blankc%E4%B9%8B%E5%80%BC%E4%BC%A0%E9%80%92%E6%8C
小万哥 小万哥
3个月前
C 语言用户输入详解:scanf、fgets、内存地址解析及实用指南
C语言中的用户输入您已经学习了printf()函数用于在C语言中输出值。要获取用户输入,可以使用scanf()函数:c//声明一个整数变量,用于存储我们从用户那里获得的数字intmyNum;//提示用户输入一个数字printf("请输入一个数字:\n");
小万哥 小万哥
3个月前
C 语言文件处理全攻略:创建、写入、追加操作解析
C语言中的文件处理在C语言中,您可以通过声明类型为FILE的指针,并使用fopen()函数来创建、打开、读取和写入文件:cFILEfptr;fptrfopen(filename,mode);FILE基本上是一个数据类型,我们需要创建一个指针变量来使用它(f
小万哥 小万哥
2星期前
C++ 引用和指针:内存地址、创建方法及应用解析
C引用和指针创建引用引用变量是对现有变量的“别名”,它是使用&运算符创建的:cstringfood"Pizza";//食物变量string&mealfood;//对food的引用现在,我们可以使用变量名food或引用名meal来引用食物变量:c