gpt4 book ai didi

c - 通过指针打印二维数组

转载 作者:行者123 更新时间:2023-11-30 19:01:33 25 4
gpt4 key购买 nike

我的老师给了我一个问题来解决:-

1) User will input "n" number of triangles.

2) After inputting "n", The user will input the sides of triangles.

3) We basically have to print those sides (Basically a question of 2-D arrays).

这是我对问题的实现:-

# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
int main(void)
{
int number_of_triangles; // Takes the value of number of triangles the user will input.
scanf("%d", &number_of_triangles);

int *array;
array = malloc(number_of_triangles * 3 * sizeof(int));
//trying to create a 2D array whose column size is fixed i.e. 3.


int i,j; // Counter variables.

for(i = 0; i < number_of_triangles; i++)
{
for(j = 0; j < 3; j++)
{
scanf("%d", ((array + i) + j)); // Scanning value of sides of triangle.
}
}

for(i = 0; i < number_of_triangles; i++)
{
for(j = 0; j < 3; j++)
{
printf("%d ", (*(array + i) + j));//printing those sides. <-This is the problem statement.
}
printf("\n");
}
return 0;
}

代码工作正常,但我对下面给出的这一行有疑问:-

for(i = 0; i < number_of_triangles; i++)
{
for(j = 0; j < 3; j++)
{
printf("%d ", (*(array + i) + j));
//printing those sides. <-This is the problem statement.
}
printf("\n");
}

不应该是 printf("%d ", *(*(array + i) + j)) 而不是 printf("%d ", (*(array + i) + j)) 获取三角形边的值?

如果我输入 printf("%d ", *(*(array + i) + j)) 然后我会收到错误:-

Indirection requires pointer operand ('int' invalid).

我在 C 中学到的是,为了取消引用二维数组指针,我们必须使用前一种方法,而不是我在代码中使用的后一种方法。我哪里出错了?

最佳答案

您不能取消引用两次。您正在处理一个一维数组,并将其用作二维数组。

array + i 的类型为 int *,因此 *(array + i) 的类型为 int,您无法再次取消引用。

相反,您希望使用 ij 来获取正确的索引。您想要的索引是i * 3 + j:

*(array + i * 3 + j)

但是使用 [] 表示法要漂亮得多,它是等效的:

array[i * 3 + j]
<小时/>当您有一个通过指向数组的指针数组构造的二维数组时,或者当使用的类型是多维数组时,可以使用

*(*(array + i) + j)) .

例如:

int **array;
array = malloc(number_of_triangles * sizeof(int *));

for (int i = 0; i < number_of_triangles; ++i)
array[i] = malloc(3 * sizeof(int));

for (int i = 0; i < number_of_triangles; ++i)
for (int j = 0; j < 3; ++j)
printf("array[%d][%d]: %d\n", i, j, *(*(array + i) + j)));

(我省略了分配成功的所有检查。如果使用此代码,则必须包含这些检查。)

请注意,示例的最后一行非常难看。 *(*(array + i) + j)) 相当于 array[i][j]。因此可以重写:

        printf("array[%d][%d]: %d\n", i, j, array[i][j]);

双重取消引用的另一个用途是多维数组类型。

例如,如果您提前知道三角形的数量:

int array[5][3];

for (int i = 0; i < 5; ++i)
for (int j = 0; j < 3; ++j)
printf("array[%d][%d]: %d\n", i, j, *(*(array + i) + j)));

在这种情况下,我们利用了数组标识符衰减为指向其第一个元素的指针这一事实。 array + i 是指向第 i 个三角形的指针,因此 *(array + i)int * 类型的左值 指向三角形 iint 数组 3。

*(array + i) + j 是一个 int *,指向三角形 i 的边 j >,因此 *(*(array + i) + j)) 是该元素的 int 类型的左值。

同样,使用数组表示法会更漂亮,将 *(*(array + i) + j)) 替换为 array[i][j]

关于c - 通过指针打印二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57661397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com