gpt4 book ai didi

c - 根据我的编译器的说法,我错误地使用了指针来设置二维数组的值。但是,我不确定我到底做错了什么

转载 作者:行者123 更新时间:2023-11-30 15:17:13 24 4
gpt4 key购买 nike

这是我的代码片段:

void initialize_matrices(int* a, int* b, int* c);

void fill_matrix(int* matrix);

void add_matrices(int* a, int* b, int* c);

void print_sum_matrix(int* c);


int main()
{

int a[3][3];
int b[3][3];
int c[3][3];

//Q2: define pointers (5)
//Define pointers ap, bp, and cp to the matrices that are defined above

int (*ap)[3][3] = &a; //giving the pointers a location to point to.
int (*bp)[3][3] = &b;
int (*cp)[3][3] = &c;

initialize_matrices(ap, bp, cp);

printf("Matrix a:\n");
fill_matrix(ap);

printf("Matrix b:\n");
fill_matrix(bp);

add_matrices(ap, bp, cp);

print_sum_matrix(cp);

return 0;
}

//Q3: initialize (10)
//loop through the matrices and set each integer value to 0 using pointers
void initialize_matrices(int* a, int* b, int* c)
{

for (int i = 0; i < 3; i++) //rows
{

for (int j = 0; j < 3; j++) //columns
{
*a[i][j] = 0; //accessing & changing the address that the pointer is pointing to?
*b[i][j] = 0;
*c[i][j] = 0;
}

}

}

我向 friend 请教,他们告诉我将 *a[i][j] = 0 更改为 a[i * 3 + j] = 0。这是真的吗?如果是这样,为什么我必须这样做?据我了解,指针“指向”的值或至少指针指向的地址的值可以用我上面编写的代码进行修改。

最佳答案

在 Q1 中,a 是一个 int[3][3],本质上是一个 3x3 整数矩阵。在计算机的内存中,这是单个连续内存块中的 9 (3x3=9) 个整数。

在 Q2 中 ap 是一个指向 int[3][3] 的指针。

所以当你想通过a在矩阵中设置一个值时,你可以像a[i][j] = 0;那样操作,但是通过 >ap 你可以这样做 (*ap)[i][j] = 0; 请注意,这里需要用括号将 *ap 括起来,否则索引([i][j])将首先发生。

但是,在第三季度,当您想要将 int[3][3] 传递给函数,然后更改它时,它会变得有点棘手。我们需要传递一个指针才能修改现有矩阵。

所以我们可以写(再次注意括号,它们很重要)

void initialize_matrices(int (*ap)[3][3], int (*bp)[3][3], int (*cp)[3][3]) {
...
(*ap)[i][j] = 0;
...
}

我们会调用这样的函数:initialize_matrices(ap, bp, cp);initialize_matrices(&a, &b, &c);

或者我们可以写

void initialize_matrices(int *aq, int *bq, int *cq) {
...
aq[j*3 + i] = 0;
...
}

在这种情况下,我们必须调用像 initialize_matrices((int *)&a, (int *)&b, (int *)c) 这样的函数 - 我们正在进行转换 指向 int[3][3] 的指针,指向整数的指针(可能是序列中的第一个,就像我们的例子一样)。

这是可能的,因为正如我之前提到的,int[3][3] 是内存中 9 个整数的连续 block 。当您执行 (*ap)[i][j] = 0; 时,计算机实际上会自动进行数学计算以计算出要设置哪一个,但是当您丢弃有关这两个的信息时维数组它不能再这样做了,所以你必须自己做,用[column_index*ROW_LENGTH + row_index]。

说明情况:

Offset : 2D Access : 1D Access
00 : a[0][0] : 0x3 + 0 <--- my ap and aq would both point to here, but have different types
01 : a[0][1] : 0x3 + 1
02 : a[0][2] : 0x3 + 2
============ <- end of row 0, visual aid only, memory addresses are consecutive
03 : a[1][0] : 1x3 + 0
04 : a[1][1] : 1x3 + 1
05 : a[1][2] : 1x3 + 2
============ <- end of row 1
06 : a[2][0] : 2x3 + 0
07 : a[2][1] : 2x3 + 1
08 : a[2][2] : 2x3 + 2
============ <- end of row 2, end of matrix

如果您可以根据需要定义 initialize_matrices() 函数,我建议您使用第一个版本,因为您可能会发现它更容易理解。

关于c - 根据我的编译器的说法,我错误地使用了指针来设置二维数组的值。但是,我不确定我到底做错了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32599933/

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