数组与指针的关系

在学习数组和指针的关系之前,请务必了解以下两个主题:


数组与指针的关系

数组是一块连续的数据块。让我们编写一个程序来打印数组元素的地址。

#include <stdio.h>
int main() {
   int x[4];
   int i;

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

   printf("Address of array x: %p", x);

   return 0;
}

输出

&x[0] = 1450734448
&x[1] = 1450734452
&x[2] = 1450734456
&x[3] = 1450734460
Address of array x: 1450734448

数组x的两个连续元素之间有4个字节的差值。这是因为int在我们的编译器上占4个字节。

请注意,&x[0]x的地址是相同的。这是因为变量名x指向数组的第一个元素。

Relation between arrays and pointers
数组与指针的关系

从上面的例子可以看出,&x[0]等同于x。并且,x[0]等同于*x

同样,

  • &x[1]等同于x+1,而x[1]等同于*(x+1)
  • &x[2]等同于x+2,而x[2]等同于*(x+2)
  • ...
  • 基本上,&x[i]等同于x+i,而x[i]等同于*(x+i)

示例1:指针和数组

#include <stdio.h>
int main() {

  int i, x[6], sum = 0;

  printf("Enter 6 numbers: ");

  for(i = 0; i < 6; ++i) {
  // Equivalent to scanf("%d", &x[i]);
      scanf("%d", x+i);

  // Equivalent to sum += x[i]
      sum += *(x+i);
  }

  printf("Sum = %d", sum);

  return 0;
}

运行程序后,输出将是

Enter 6 numbers: 2
3
4
4
12
4
Sum = 29 

在这里,我们声明了一个包含6个元素的数组x。为了访问数组的元素,我们使用了指针。


在大多数情况下,数组名会“衰退”成指针。简单来说,数组名会被转换为指针。这就是为什么您可以使用指针来访问数组元素的原因。但是,您应该记住,指针和数组是不同的

在少数情况下,数组名不会衰退成指针。要了解更多信息,请访问:数组名何时不衰退为指针?


示例2:数组和指针

#include <stdio.h>
int main() {

  int x[5] = {1, 2, 3, 4, 5};
  int* ptr;

  // ptr is assigned the address of the third element
  ptr = &x[2]; 

  printf("*ptr = %d \n", *ptr);   // 3
  printf("*(ptr+1) = %d \n", *(ptr+1)); // 4
  printf("*(ptr-1) = %d", *(ptr-1));  // 2

  return 0;
}

运行程序后,输出将是

*ptr = 3 
*(ptr+1) = 4 
*(ptr-1) = 2

在此示例中,第三个元素的地址&x[2]被赋给了ptr指针。因此,当我们打印*ptr时,显示的是3

而打印*(ptr+1)则给出第四个元素。同样,打印*(ptr-1)给出第二个元素。

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战