【问题标题】:What's the difference between "int *a[5]" and int(*a)[5]"? [duplicate]“int *a[5]”和int(*a)[5]”有什么区别? [重复]
【发布时间】:2014-11-05 14:23:52
【问题描述】:

它们在 C 和 C++ 上的工作方式会有所不同吗?

【问题讨论】:

  • 上一个线程中答案的一个关键点是注意 int (*a)[5] 可以是指向每行有 5 个整数的矩阵的第一行的指针,这样 a[0] 指向第一行,a[1] 指向第二行,... .

标签: c++ c arrays pointers


【解决方案1】:
  1. int *a[5] - 这意味着“a”是一个指针数组,即数组“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;
   }

【讨论】:

  • 感谢您的回答 :) 这很有帮助!
【解决方案2】:

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

#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 的指针的数组

第二个 (int(*b)[5]) 是指向 5 个整数数组的指针

区别在于()

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

【讨论】:

    【解决方案3】:

    int* a[5]a 声明为指向 int 的指针的数组 5

    int (*a)[5] 声明 a 为指向 int 数组 5 的指针

    我建议您使用cdecl 来理解此类或任何复杂的声明。

    【讨论】:

    • cdecl 是新东西!谢谢你:)
    【解决方案4】:

    这是一个由 5 个指向 int 的指针组成的数组:

    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++。

    【讨论】:

    • 你能初始化它并举例说明元素的访问是如何工作的吗? (我希望这是回复答案的方式:))
    • @RaghavSharma int* a[5]; int* b=a[0]; int b[5]; int (*c)[5]=&amp;b; int y=(*c)[0]
    • @RaghavSharma 我添加了一个示例
    • @RaghavSharma : #include int main() { int b = 3;诠释 c = 4; int *a[2] = {&b, &c}; printf("a[0] 指向的值 = %d, a[1] = %d\n", *a[0], *a[1]);返回0; }
    • 在上面的例子中,对于指针p,我们可以让它指向大于5的数组还是在整个程序中限制为5?