【问题标题】:Initializing "a pointer to an array of integers"初始化“指向整数数组的指针”
【发布时间】:2013-07-24 22:21:38
【问题描述】:
 int (*a)[5];

我们如何初始化一个指向上面显示的 5 个整数数组的指针。

下面的表述正确吗?

int (*a)[3]={11,2,3,5,6}; 

【问题讨论】:

  • C 中的“指向数组的指针”从来没有任何用处。它只是模糊了代码,没有任何好处。只需声明和初始化数组,并使用指向其元素类型的指针。
  • @LeeDanielCrocker:这不是真的——指向数组的指针是动态分配多维数组的最有效方式(如int (*a)[5] = malloc(nrows * sizeof *a);
  • 是的,这很简单,但这仅适用于您在编译时知道内部维度的情况,而不适用于更一般的情况。
  • @LeeDanielCrocker:同样适用于 VLA:size_t cols; ...; int (*a)[cols] = malloc( nrows * sizeof *a );。这也是二维数组表达式在传递给函数时衰减的内容。 OP 的用法不正确,但这并不意味着它们毫无用处。

标签: c arrays pointers initialization


【解决方案1】:

假设您有一个长度为 5 的 int 数组,例如

int x[5];

那你就可以a = &x;

 int x[5] = {1};
 int (*a)[5] = &x;

要访问数组的元素:(*a)[i] (== (*(&x))[i]== (*&x)[i] == x[i]) 需要括号,因为 [] 运算符的优先级高于 *。 (一个常见的错误可能是使用*a[i] 来访问数组的元素)。

了解您提出的问题是编译时错误:

int (*a)[3] = {11, 2, 3, 5, 6}; 

这是不正确的,也是类型不匹配,因为{11,2,3,5,6} 可以分配给int a[5];,而您正在分配给int (*a)[3]

另外,

你可以为一维做类似的事情:

int *why = (int p[2]) {1,2};

同样,对于二维试试这个(感谢@caf):

int (*a)[5] = (int p[][5]){ { 1, 2, 3, 4, 5 } , { 6, 7, 8, 9, 10 } };

【讨论】:

  • @Flow 第二次不正确尝试,如int (*a)[5]= (int(*)[5])&({11,2,3,5,6}); 使用新编译器
  • int (*a)[5] = (int [][5]){ { 1, 2, 3, 4, 5 } , { 6, 7, 8, 9, 10 } };
  • @caf 知道了 谢谢它类似于:int *why = (int[2]) {1,2}
  • @caf 知道了!!我的注释表达式不正确,因为我在常量之前使用了&
  • @caf 你的表情是c99 ?
【解决方案2】:

{11,2,3,5,6} 是一个初始化列表,它不是一个数组,所以你不能指向它。数组指针需要指向具有有效内存位置的数组。如果数组是一个命名变量或者只是一块分配的内存都没有关系。

这一切都归结为您需要的数组类型。根据目的,在 C 中声明数组有多种方法:

// plain array, fixed size, can be allocated in any scope
int array[5] = {11,2,3,5,6};
int (*a)[5] = &array;

// compound literal, fixed size, can be allocated in any scope
int (*b)[5] = &(int[5]){11,2,3,5,6};

// dynamically allocated array, variable size possible
int (*c)[n] = malloc( sizeof(int[n]) );

// variable-length array, variable size
int n = 5;
int vla[n];
memcpy( vla, something, sizeof(int[n]) ); // always initialized in run-time
int (*d)[n] = &vla;

【讨论】:

  • @MM 确实。不知道我为什么写那个。固定的。我想我试图警告将指针传递给声明范围之外的复合文字。
【解决方案3】:
int a1[5] = {1, 2, 3, 4, 5};
int (*a)[5] = &a1;

【讨论】:

    【解决方案4】:
    int vals[] = {1, 2};
    int (*arr)[sizeof(vals)/sizeof(vals[0])] = &vals;
    

    然后您访问数组的内容,如下所示:

    (*arr)[0] = ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2015-04-28
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多