【问题标题】:Can I have a 2D array of int type using pointers?我可以使用指针有一个 int 类型的二维数组吗?
【发布时间】:2020-07-03 03:20:58
【问题描述】:

大家好!我正在学习 C 语言,现在在处理指针和数组时非常混乱。

1) 为什么我不能使用指针创建一个 int 类型的二维数组?喜欢

int *arr[4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};

int **arr = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};

虽然对我来说似乎很有说服力......

  1. 另外,为什么我们使用 char * arr[5] 代替 char arr[5][40] 而不是 char * arr[40],这对我来说根本没有意义...

提前非常感谢你们!

【问题讨论】:

  • 你可以有一个指针数组,每个指针指向一个数组...或者你可以有一个指向数组的指针,指向一个数组数组。不过,两者并不相同。
  • int arr[3][4] 是你想要的。
  • int arr[][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12} };也可以使用
  • int arr[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 将使arr 成为int 的4 元素数组的3 元素数组。 int (*pArr)[4] = arr; 将使 pArr 成为指向 int 的 4 元素数组的指针,该数组指向 arr
  • 嗨@Dmitri!我明白你的意思了!因为我看到我们可以为字符串数组做到这一点,所以我想知道为什么我们不能对简单的二维数组使用它

标签: c arrays pointers


【解决方案1】:

指针不是数组,数组也不是指针。然而,指针可用于指向数组中的第一个元素。

如果您希望有一个由int 组成的二维数组或一个由int* 组成的一维数组,您需要下定决心,每个数组都指向数组的第一个元素。


二维数组很简单:

int arr[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};

这是你能得到的最快的形式,但它受限于它在内部分配的范围。


可以通过将指针指向本地范围数组来完成指向第一个元素的一维指针数组:

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

这是利用称为复合文字的特性。这些数组将与arr 具有相同的范围,并且当arr 超出范围时。


如果您需要数组在该范围之外保持活动状态,则可以改用动态内存分配:

int (*arr)[4] = malloc( sizeof(int[3][4]) );
...
arr[i][j] = something;
...
free(arr);

上面创建了一个动态分配的二维数组,然后让一个数组指针指向该二维数组中的第一个数组。


还可以通过动态分配int* 的一维数组然后让每个指针指向数组的第一个元素来创建更慢、更糟糕的代码:

int** arr = malloc( sizeof(int*[3]) );
for(size_t i=0; i<3; i++)
{
  arr[i] = malloc( sizeof(int[4]) );
}

...

for(size_t i=0; i<3; i++)
{
   free(arr[i]);
}
free(arr);

这种业余形式对你来说绝对没有优势。像上面这样的代码只有在我们需要完全可变大小的维度时才有意义,而在静态二维数组的情况下我们不需要。

所以这个版本所做的只是对堆和块数据缓存利用率进行分段,浪费内存和执行速度。您还需要使用循环分几个步骤将其 free()。

更多信息:Correctly allocating multi-dimensional arrays

【讨论】:

  • 哇...非常感谢伦丁!我需要慢慢消化!
【解决方案2】:

@Dmitri 说得对。

你可以有一个指针数组,每个指针指向一个数组...或者你可以有一个指向数组的指针,指向一个数组数组。

例子:

int r = 3, c = 4;

int **arr = (int **)malloc(r * sizeof(int *)); 
for (int i=0; i<r; i++) 
     arr[i] = (int *)malloc(c * sizeof(int)); 

初始化后,就可以赋值了。

【讨论】:

  • 嗨迪帕克!谢谢你的澄清!只是我看到我们可以对字符串数组执行此操作(使用 char ar*[5] 替换 char ar[5][40]),所以我想知道为什么我们不能对简单的 2D 数组使用它
猜你喜欢
  • 1970-01-01
  • 2016-01-12
  • 2021-07-25
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 2019-05-21
相关资源
最近更新 更多