为什么指向指针的指针可以像数组一样?

时间:2014-02-19 20:53:38

标签: c pointers

我在其中一门课上学习C语言。在我的一个实验室中,我们需要使用一组结构。

我的一个实验室TA告诉我,我应该使用这样的数组:

typedef struct person {

  int age;
  char *name;

} Person;

int main() {

  Person **people = (Person **)malloc(sizeof(Person *));

  Person *personA = (Person *)malloc(sizeof(Person));
  personA->age = 18;
  personA->name = "LeBron James";

  Person *personB = (Person *)malloc(sizeof(Person));
  personB->age = 20;
  personB->name = "Kobe Bryant";

  Person *personC = (Person *)malloc(sizeof(Person));
  personC->age = 21;
  personC->name = "Michael Jordan";

  people[0] = personA;
  people[1] = personB;
  people[2] = personC;

  printf("Name of first person is %s \n", people[0]->name);
  printf("Name of second person is %s \n", people[1]->name);
  printf("Name of second person is %s \n", people[2]->name);

结果是对的。但是我不明白为什么指向指针(people)的指针可以像数组一样? (例如people[0] = personA

有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:3)

它有效,因为它基本上是语法糖。 ANSI标准定义它:

  

下标运算符[]的定义是E1 [E2]与(*(E1 +(E2)))相同

因此,您可以使用取消引用运算符*a查看地址中的特定元素,或使用a[b]运算符查看b的{​​{1}}元素。

正如其他人已经指出的那样,你的示例代码非常错误。

答案 1 :(得分:1)

Person **people = (Person **)malloc(sizeof(Person *));

应该是

Person **people = (Person **)malloc(sizeof(Person *) * 3);

否则当你这样做时

people[0] = personA;
people[1] = personB;
people[2] = personC;

您编写的8字节数据(假设为32位)超出了分配的范围。

可以使用像数组这样的指针的原因是因为它们或多或少是相同的,特别是在直接C中。

例如:

int* numberlist = malloc(sizeof(int) * 10)

int numberlist[10];

可以通过相同的方式访问。唯一的区别是如何分配内存。