问题描述
- 二维数组行指针的问题
-
问一个比较呆的问题,今天看到了这样一个程序,运行结果是9,我就糊涂了
(pa+1)[1]是什么啊
为什么(pa+1)[0]是5呢
那个方括号里的数字指什么呢
我真是彻底晕了
求指教~
#include
void main()
{
static int a[3][4]={1,2,3,4,5,6,7,8,9,10},(*pa)[4]=a;
cout<<*(pa+1)[1]<<endl;
}
解决方案
#include
int main()
{
int a[3][4] = {
1,2,3,4,
5,6,7,8,
9,10
};
int (*b)[4] = a ;
printf("%d %dn",*(b+1)[1],*(b)[1]);
//测试结果: 9 5
printf("%d %dn",(*(b+1))[1],(*(b))[1]);
//测试结果: 6 2
return 0;
}
看见了吧,相信 你能看明白了。
首先运算符的先后顺序 *b[1] = * (b[1])
而之前 (*b)[4] = a
说明 把 a的首地址 也就是 &(a[0][0]) 赋值给了 (*b)[4] 这个数组 。
(*b)[4] 这个数组 是个 指针数组。 赋值结束后
*b 代表了第一行第一列的值,你可以打出来看看( printf("%dn",*b[0] ), 而b 就代表了第一行第一列 的 首地址 ,所以 b = a.
所以 b[1] = a[1]
so
*(b+1)[1] = * ( (b+1)[1]) = * (b+1 + 1) = * a[2] = a[2][0] ;
over!
解决方案二:
pa+1 是按 pa 的定义直接接 4 个数据,然后再 加 0/1,所以就是下标 4/5 对应的数值.
解决方案三:
数组指针 与 指针数组
你需要看一下上面的博文,了解这两个基本概念。
解决方案四:
代码不全,不知道pa是什么类型。需要根据它的类型判断它+1得到的地址偏移是多少。
解决方案五:
(*pa)[4] = a;这句换一下应该是 pa = (*a)[4]//不知道这样写对不对。它的意思是指针pa指向a的第4列,而(pa + 1)相当于指向第4列的指针都向前移一位,那就是原来的指向4的指针向下移了一位,指向了5即:*(pa + 1)[0] = 5; 原来只想8的指针向下移一位,指向9 即: *(pa+1)[1] = 9;