指向 2D 数组的指针如何在幕后工作?
Posted
技术标签:
【中文标题】指向 2D 数组的指针如何在幕后工作?【英文标题】:How does a pointer to a 2D array work underneath the hood? 【发布时间】:2019-02-13 04:58:27 【问题描述】:我不明白为什么这段应该执行矩阵乘法的代码出错了。
输入: 2x2 矩阵,两个矩阵中都有元素 1,2,3,4
预期输出: 7 10 15 22
此代码给出的输出: 15 22 12 16
int a[10][10], b[10][10], c[10][10], i, j, k, r1, c1, r2, c2;
int (*pa)[10][10] = &a, (*pb)[10][10] = &b, (*pc)[10][10] = &c;
for ( i = 0; i < r1; i++)
for(j = 0; j < c2; j++)
*pc[i][j] = 0;
for(k = 0; k < c1; k++)
*pc[i][j] += *pa[i][k] * *pb[k][j];
我尝试使用这样的打印语句进行调试,结果如下:
当给定以 1,2,3,4 作为元素的 2x2 矩阵时,会产生以下错误:
at 00 of a is 3
at 00 of b is 1
Elements you're multiplying: 3 1
但预期的输出是这样的:
at 00 of a is 1
at 00 of b is 1
(其他元素似乎也是如此) 此处未粘贴的其余代码没有错误。使用打印语句彻底检查。
【问题讨论】:
检查这个答案 - ***.com/questions/48245019/…*pc[i][j]
应该是 (*pc)[i][j]
,其他指针也是如此。索引运算符 ([]
) 的优先级高于取消引用运算符 (*
),因此您需要括号来获得所需的操作顺序。
@John Bollinger 我尝试了这种方法,但没有奏效。 :(( 刚刚知道指向 int array[3] 的指针将指向三个整数的数组,而指针算术(例如,指针 + 1)将指向这三个整数之外的地址。如果是这种情况,就没有办法使用指向 2D 数组的指针访问 2D 数组的元素,对吗??
我无法解释为什么与您提供的代码不同的一段代码也不起作用,但我向您保证,通过您的指针 pa
、pb
和 @987654331 @ 如您所示声明和初始化,a[i][j] == (*pa)[i][j]
对于所有 i
和 j
不超过数组边界,对于其他数组指针也是如此。
指针 to 二维数组的工作方式与指向一维数组的指针或指向任何其他数据的指针完全相同。没有任何区别。不过,我们很少使用 to 数组的指针。 into 数组的指针通常可以完成这项工作。在此代码中,根本不需要指针。为什么不抛弃它们,直接使用 a、b 和 c?
【参考方案1】:
首先参考这些答案:
Pointer address in a C multidimensional array
Create a pointer to two-dimensional array
两者一起回答你的问题。这是您的代码的工作版本(简单版本):
#include<stdio.h>
void main()
int a[2][2]=1,2,3,4;
int b[2][2]=1,2,3,4;
int c[2][2], i, j, k, r1=2, c1=2, r2=2, c2=2;
int (*pa)[2] = a, (*pb)[2] = b, (*pc)[2] = c;
for ( i = 0; i < r1; i++)
for(j = 0; j < c2; j++)
pc[i][j] = 0;
for(k = 0; k < c1; k++)
pc[i][j] += pa[i][k] * pb[k][j];
for(i=0;i<2;i++)
printf("\n");
for(j=0;j<2;j++)
printf("%d\t",c[i][j]);
【讨论】:
以上是关于指向 2D 数组的指针如何在幕后工作?的主要内容,如果未能解决你的问题,请参考以下文章