我给出了以下代码段:
int group1[3][3] = {3,4,5,1,9,8};
int group2[3][3] = {{1},{2,3},{4,5}};
int *gPtr1 = group1;
int *gPtr2 = group2;
这个问题要求我的价值:(我本来应该在纸上回答这个,当然,没有电脑)
*(gPtr1 + 3)
*(gPtr2 + 3)
通常,我知道对于一维数组,它会添加一个"地址"而不是价值。例如:
int balance[10]={1,2,6,4};
int *p=balance; //p points to balance [0]
p+=3; //points to balance [3]
然而,我似乎无法制作一个指向2D数组的指针来测试它,因为在问题中,我总是得到一个"来自不兼容指针类型的初始化"错误。
答案 0 :(得分:2)
正确的记录看起来像
int ( *gPtr1 )[3] = group1;
int ( *gPtr2 )[3] = group2;
这些表达
*(gPtr1 + 3)
*(gPtr2 + 3)
尝试在数组的最后一个元素之后访问内存,因为数组只有三行。这就是表达式*(gPtr1 + 3)
的类型是int[3]
,并且在oridinal数组中只有三个这样的元素。
或者你可以写
int *gPtr1 = ( int * )group1;
int *gPtr2 = ( int * )group2;
在这种情况下,使用指针将数组解释为具有9个元素和表达式的一维数组
*(gPtr1 + 3)
*(gPtr2 + 3)
将相应返回
1
2
答案 1 :(得分:2)
要访问group1的地址,请以这种方式将其传递给指针:
int *gPtr1 = &group1[0][0];
使用它很容易找到灵魂:1和2。
答案 2 :(得分:0)
也许这会帮助您入门:
#include <stdio.h>
int group1[3][3] = {3,4,5,1,9,8};
int group2[3][3] = {{1},{2,3},{4,5}};
int main( void )
{
int *p;
int i;
for (p = group1[0], i = 0; i < 9; ++i, ++p )
printf( "%d - ", *p);
printf( "\n" );
for (p = group2[0], i = 0; i < 9; ++i, ++p )
printf( "%d - ", *p);
printf( "\n" );
return 0;
}
如果您了解该2D阵列中的内存是如何存储的,那么应该清楚为什么这会起作用。因为我认为理解是你正在寻找的,所以我会让你自己想出那个部分。 : - )
答案 3 :(得分:0)
二维矩阵在存储器中以行主要顺序表示。这是因为内存是一维的,因此它将二维数组存储为连续的行列表。
创建group1时,会得到一个长度为9的整数数组,它看起来像:
3 4 5 1 9 8 _ _ _
因此,当您执行*(gPtr1 + 3)
时,会将3
添加到gPtr1
的原始位置,即3
的地址。添加3
会将您带到1
的位置,您可以取消引用该位置。
因此,当你创建group2时,你得到一个长度为9的整数数组,它看起来像:
1 _ _ 2 3 _ 4 5 _
因此,当您执行*(gPtr2 + 3)
时,会将3
添加到gPtr2
的原始位置,即1
的地址。添加3
会将您带到2
的位置,您可以取消引用该位置。