指向另一个数组

时间:2016-01-05 06:20:09

标签: c arrays

我是C的新手。

创建一个数组,该数组在每个索引处保存指向另一个动态大小数组的指针。

int main()
{
  unsigned int i , j;

  int* array1[2];
  int a1[] = {1,2,3};
  int a2[] = {2,3};

  array1[0] = a1;
  array1[1] = a2;

  for (i=0 ; i < 2; i++) {
     printf(" the value of array1[%d] = %d" , i , *array1[i]);
  }

  return 1;
}
  

array1 [0]的值= 1

     

array1 [1]的值= 2

只有第一个元素被打印出来。如何打印索引所指向的整个数组。我错过了什么。

EDITED :: 我现在明白了这个用法,但同样直接做了,导致了一个数组。

`unsigned int* c[3];
 c[0] = {0, 5, 4, 7};  //  This Line Err` 
 c[1] = {0, 5, 4, 3, 2, 6, 7};
 c[2] = {0, 5, 4, 3, 2};
  

导致错误:文件try.c line xx function main:`{'

之前的语法错误

为什么??

由于

3 个答案:

答案 0 :(得分:2)

如您所知, array1 [0] 包含指向a1数组的第一个元素的指针;要打印a1数组的所有元素,你应该迭代它,如下所示:

for (int i = 0; i < 2; i++){
    printf(" the value of a1[%d] = %d", i, *(array1[0] + i);
}

答案 1 :(得分:1)

数组被衰减为C中的指针,特别是在将其作为参数传递时(或将其存储在指针中)。

您缺少的是,在运行时,数组的实际大小保留(并且sizeof编译时运算符,已替换由编译器通过常量 - 除了VLA s)。

您可能希望将数组大小及其内容保持在一起。使用struct和最后flexible array member是一种可爱的方式:

struct vect_st { unsigned size; int flexarr[]; };
struct vect_st* arr1[2];

此类结构需要heap allocated(因为您只知道它们在运行时的实际大小):

arr1[0] = malloc(sizeof(struct (vect_st) + 2*sizeof(int));
if (!arr1[0]) {perror("malloc arr1[0]"); exit(EXIT_FAILURE); };
arr1[0]->size = 2;
arr1[0]->flexarr[0] = 4;
arr1[0]->flexarr[1] = 17;
arr1[1] = malloc(sizeof(struct (vect_st) + 3*sizeof(int));
if (!arr1[1]) {perror("malloc arr1[1]"); exit(EXIT_FAILURE); };
arr1[1]->size = 3;
arr1[1]->flexarr[0] = 5;
arr1[1]->flexarr[1] = 6;
arr1[1]->flexarr[2] = 7;

当然,你应该在你不需要时释放内存,所以你可能会用{/ p>这样的代码结束你的main

free(arr1[0]), arr1[0] = NULL;
free(arr1[1]), arr1[1] = NULL;

谨防memory leaksbuffer overflows和其他undefined behavior。所以用所有警告编译你的代码&amp;调试信息(gcc -Wall -Wextra -g)并使用valgrindgdb debugger

另请注意,您通常不应将非小型数组(或聚合)声明为本地数据(例如int biglocarr[1000000];或其他一些函数中的某些本地 main ,因为call stack的大小有限(通常为几兆字节,因此每个呼叫帧不超过几百字节)。阅读stack overflows并避免使用它们。

答案 2 :(得分:0)

你正在使用* array1 [i],这里“*”表示array1 [i]的指针和值,i在第一种情况下为0,因此它指向a1 base,即1,依此类推..