“int *a[5]”和“int(*a)[5]”有什么区别?

7
它们在C和C ++上的工作方式是否不同?

在上一个线程的回答中,其中一个关键点是要注意 int (*a)[5] 可能是指向一个矩阵的第一行,该矩阵每行有 5 个整数,因此 a[0] 指向第一行,a[1] 指向第二行,...。 - rcgldr
4个回答

17
  1. int *a[5] - 这意味着"a"是一个指针数组,即数组中的每个成员都是指向整数类型的指针; 数组的每个成员可以保存一个整数的地址。

  2. int (*a)[5] - 在这里,"a"是一个指向包含5个整数的数组的指针,换句话说, "a"指向一个包含5个整数的数组。

示例:

#include<stdio.h>
   int main()
   {
           int b = 3;
           int c = 4;
           int *a[2] = {&b, &c}; // is same as ---int *a[] = {&b, &c} 
           printf("value pointed to by a[0] = %d, by a[1] = %d\n", *a[0], *a[1]);
           return 0;
   }

谢谢您的回答 :) 非常有帮助! - Raghav Sharma

8

是的,有很大的区别。让我们看一些代码:

#include <stdio.h>

int main()
{
    int *a[5]; // same as: int *(a[5]);
    int(*b)[5];

    printf("*a[5] vs (*b)[5] : %d vs %d", sizeof (a), sizeof(b));
    // *a[5] vs (*b)[5] : 20 vs 4
}   

这是什么意思?

第一种情况(int *a[5])是指向整型的5个指针数组

而第二种情况(int(*b)[5])是指向包含5个整型的数组的指针

区别在于这里的()

是的,这种行为在C和C++中是相同的。


6

这是一个包含5个指向整型变量的指针的数组:

int* a[5];

这是一个指向包含5个整数的数组的指针:

int (*a)[5];

以下是一个示例,说明如何初始化指针或指针数组的元素:
int a[5] = {0, 1, 2, 3, 4};
int (*p)[5]; // pointer to array of 5 ints
int* b[5];   // array of 5 pointers to int

p = &a; // p points to a

for (int i = 0; i < 5; ++i)
  std::cout << (*p)[i] << " ";
std::cout << std::endl;

// make each element of b point to an element of a
for (int i = 0; i < 5; ++i)
  b[i] = &a[4-i];

for (int i = 0; i < 5; ++i)
  std::cout << b[i] << " ";
std::cout << std::endl;

请注意,尽管我在示例中使用了C++,但这同样适用于C和C++。

你能初始化它并且给一个访问元素的例子吗?谢谢!(我希望这是回答的方式 :)) - Raghav Sharma
@RaghavSharma int* a[5]; int* b=a[0]; int b[5]; int (*c)[5]=&b; int y=(*c)[0]@RaghavSharma int* a[5]; int* b=a[0]; int b[5]; int (*c)[5]=&b; int y=(*c)[0] - IdeaHat
@RaghavSharma 我添加了一个例子 - juanchopanza
#include<stdio.h> int main() { int b = 3; int c = 4; int *a[2] = {&b, &c}; printf("a[0]所指向的值为%d,a[1]所指向的值为%d\n", *a[0], *a[1]); return 0; } - Abhishek Choubey
谢谢大家 :) @juanchopanza 好的,谢谢你 :) - Raghav Sharma
1
在上面的例子中,对于指针 p,我们能否让它指向大小大于5的数组,还是它在整个程序中只限于大小为5? - The Room

6

int* a[5] 声明 a 为指向 int 的指针数组,长度为 5。

int (*a)[5] 声明 a 为指向包含 5 个 int 元素的数组的指针。

我建议您使用CDeclarer来理解这样或任何复杂的声明。


cdecl 是一些新的东西!谢谢 :) - Raghav Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接