最适合网络开发者的网站
C 语言。W3Schools 英文版。初学者课程

尿素 西斯

C 指针和数组


指针和数组

您还可以使用指针来访问 数组.

考虑以下整数数组:

例子

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

您从本章中学到了 数组 你可以使用for 环形:

例子

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

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

结果:

25
50
75
100
亲自尝试 »

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

例子

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

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

结果:

0x7ffe70f9d8f0
0x7ffe70f9d8f4
0x7ffe70f9d8f8
0x7ffe70f9d8fc
亲自尝试 »

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

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

例子

// 创建一个 int 变量
int 我的Int;

// 获取 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 = 0;i < 4;i++){
printf("%d\n", *(ptr + i));
}

结果:

25
50
75
100
亲自尝试 »

也可以用指针来改变数组元素的值:

例子

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

// 将第一个元素的值更改为 13
*我的数字 = 13;

// 将第二个元素的值更改为 17
*(我的数字+1) = 17;

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

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

结果:

13
17
亲自尝试 »

这种处理数组的方式可能看起来有点过分。尤其是对于上面示例中的简单数组。但是,对于大型数组,使用指针访问和操作数组的效率要高得多。

它也被认为更快、更容易访问 二维数组 带有指针。

由于字符串实际上是数组,因此你也可以使用指针来访问 字符串.

现在,您知道这是如何工作的,这很好。但就像我们在上一章中提到的那样; 必须小心处理指针,因为有可能覆盖存储在内存中的其他数据。