C 指针和数组


指针和数组

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

考虑以下整数数组:

示例

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

你从数组章节您可以使用 a 循环遍历数组元素for环形:

示例

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。

这是因为一个的大小inttype 通常是 4 个字节,记住:

示例

// Create an int variable
int myInt;

// Get the memory size of an int
printf("%lu", sizeof(myInt));

结果:

4
亲自试一试 »

所以从上面的"memory address example"可以看出,编译器为每个数组元素保留了4个字节的内存,这意味着整个数组占用了16个字节(4 * 4)的内存存储:

示例

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

// Get the size of the myNumbers array
printf("%lu", sizeof(myNumbers));

结果:

16
亲自试一试 »

指针与数组有何关系

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

使困惑?让我们尝试更好地理解这一点,并再次使用上面的"memory address example"。

这个内存地址第一个元素数组的名称:

示例

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

// Get the memory address of the myNumbers array
printf("%p\n", myNumbers);

// Get the memory address of the first array element
printf("%p\n", &myNumbers[0]);

结果:

0x7ffe70f9d8f0
0x7ffe70f9d8f0
亲自试一试 »

这基本上意味着我们可以通过指针使用数组!

如何?由于 myNumbers 是指向 myNumbers 中第一个元素的指针,因此您可以使用*运算符访问它:

示例

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

// Get the value of the first element in myNumbers
printf("%d", *myNumbers);

结果:

25
亲自试一试 »

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

示例

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

// Get the value of the second element in myNumbers
printf("%d\n", *(myNumbers + 1));

// Get the value of the third element in myNumbers
printf("%d", *(myNumbers + 2));

// and so on..

结果:

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};

// Change the value of the first element to 13
*myNumbers = 13;

// Change the value of the second element to 17
*(myNumbers +1) = 17;

// Get the value of the first element
printf("%d\n", *myNumbers);

// Get the value of the second element
printf("%d\n", *(myNumbers + 1));

结果:

13
17
亲自试一试 »

这种处理数组的方式可能看起来有点过分。特别是对于像上面的示例中这样的简单数组。然而,对于大型数组,使用指针访问和操作数组会更有效。

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

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

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