C语言的指针问题,向您请教,谢谢!
voidmain(void){/*声明一个3维数组并初始化*/intA[2][3][4]={{{1,2,3,4},{5,6,7,8},{9,10,11,12}},{{13...
void main(void)
{
/*声明一个3维数组并初始化*/
int A[2][3][4]={{{1,2,3,4},{5,6,7,8},{9,10,11,12}},
{{13,14,15,16},{17,18,19,20},{21,22,23,24}}};
int (*pA)[3][4]=A;
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
for(int k=0;k<4;k++)
printf("%d","*(*(*(pA+i)+j)+k)"); /*遍历输出*/
我的问题是:
1.在第6行,运用"int(*pA)[3][4]=A"声明一个指向3*4(二维)数组的指针pA,为什么可以用一个三维的数组命A(常指针)对其赋值?维数不相同怎么能赋值呢?
2.若A是一个三维数组(如上述代码块中所示),那么声明一个普通指针对其初始化:
int* pA=A[0][0];
除了以上方法外还有三种方法等价:
(1).int *pA=&A[0][0][0];
(2).int *pA=(int*)A[0]; /*类型强制转换*/
(3).int *pA=(int*)A; /*类型强制转换*/
方法(2)(3)中赋值号右边A[0],A均为指针,为什么还要强制类型转换?
谢谢您的回答! 展开
{
/*声明一个3维数组并初始化*/
int A[2][3][4]={{{1,2,3,4},{5,6,7,8},{9,10,11,12}},
{{13,14,15,16},{17,18,19,20},{21,22,23,24}}};
int (*pA)[3][4]=A;
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
for(int k=0;k<4;k++)
printf("%d","*(*(*(pA+i)+j)+k)"); /*遍历输出*/
我的问题是:
1.在第6行,运用"int(*pA)[3][4]=A"声明一个指向3*4(二维)数组的指针pA,为什么可以用一个三维的数组命A(常指针)对其赋值?维数不相同怎么能赋值呢?
2.若A是一个三维数组(如上述代码块中所示),那么声明一个普通指针对其初始化:
int* pA=A[0][0];
除了以上方法外还有三种方法等价:
(1).int *pA=&A[0][0][0];
(2).int *pA=(int*)A[0]; /*类型强制转换*/
(3).int *pA=(int*)A; /*类型强制转换*/
方法(2)(3)中赋值号右边A[0],A均为指针,为什么还要强制类型转换?
谢谢您的回答! 展开
1个回答
展开全部
1. 数组在内存中是连续存放的,数组指针指向的是数组的第一个元素所在的位置。
三维数组初始化还可以这样写:
int A[2][3][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
赋值符号右边是一维数组写法,那为什么就能赋值给三维数组呢,一样的道理。
2. 数组指针是指向数组首位元素的,那么 (1) 很容易可以理解,将 A 数组首个元素地址给 P 。(2) 和(3)其实也是取出 A 数组的首个元素地址。
三维数组初始化还可以这样写:
int A[2][3][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
赋值符号右边是一维数组写法,那为什么就能赋值给三维数组呢,一样的道理。
2. 数组指针是指向数组首位元素的,那么 (1) 很容易可以理解,将 A 数组首个元素地址给 P 。(2) 和(3)其实也是取出 A 数组的首个元素地址。
追问
谢谢您的回答,但是以上代码中的三个for循环以及"*(*(*(pA+i)+j)+k)"); 不是针对三维数组的吗?怎么解释呢?麻烦您了~
追答
pA无论几维,存放在内存中都是连续的。
pA的存放形式:
{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}
pA是指向第一号元素,根据上面可以看出是 1
pA+i 假如 i 的值是 1 ,那么pA向右移动 1 个单位长度,指向的值为 2
(pA+i)+j 假如 j 是 2 ,pA+i 指向之后再移动 2 个单位,指向的值为 4
.....
依此类推
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询