c语言中,关于指针int(*p)[4]和int*p指向二维数组a[3][4]初始化的问题。
4个回答
2014-01-01
展开全部
二维数组相当于多行列数相同的一位数组组合起来;int (*p)[N]定义一个行指针p,其中:
p指向一个N列二维数组的首地址
p自增1,p指向下一“行”一维数组的首地址
因为p是一个二级指针。
所以索引其指向的数据内容需要取二次内容,格式及解释如下:
格式:*(*(p+行)+列)
解释:
其实很好理解,因为p作为二级指针,p++代表的仅仅是行号+1所以格式中*(p+行)就取到了所在行首地址指针(因为p是二级指针,取一次内容之后,取到的内容还是指针)现在把*(p+行)整体看作一个一维数组指针再进行一位数组的指针内容索引*(*(p+行)+列)就能索引到内容,当然也能进行初始化了!
例子:
#include<stdio.h>
void main()
{
int (*p)[4];
int a[3][4],i,j;
/*常规的初始化与输出*/
printf("input:\n");
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
printf("二维数组\n:");
for(i=0;i<3;i++){
for(j=0;j<4;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
/*用行指针的初始化与输出*/
p=a;
printf("input:\n");
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",*(p+i)+j);
printf("二维数组\n:");
for(i=0;i<3;i++){
for(j=0;j<4;j++)
printf("%d\t",*(*(p+i)+j));
printf("\n");
}
}
结果
p指向一个N列二维数组的首地址
p自增1,p指向下一“行”一维数组的首地址
因为p是一个二级指针。
所以索引其指向的数据内容需要取二次内容,格式及解释如下:
格式:*(*(p+行)+列)
解释:
其实很好理解,因为p作为二级指针,p++代表的仅仅是行号+1所以格式中*(p+行)就取到了所在行首地址指针(因为p是二级指针,取一次内容之后,取到的内容还是指针)现在把*(p+行)整体看作一个一维数组指针再进行一位数组的指针内容索引*(*(p+行)+列)就能索引到内容,当然也能进行初始化了!
例子:
#include<stdio.h>
void main()
{
int (*p)[4];
int a[3][4],i,j;
/*常规的初始化与输出*/
printf("input:\n");
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
printf("二维数组\n:");
for(i=0;i<3;i++){
for(j=0;j<4;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
/*用行指针的初始化与输出*/
p=a;
printf("input:\n");
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",*(p+i)+j);
printf("二维数组\n:");
for(i=0;i<3;i++){
for(j=0;j<4;j++)
printf("%d\t",*(*(p+i)+j));
printf("\n");
}
}
结果
2014-01-01
展开全部
还是我来告诉你吧!前者是二级地址,就是地址的地址。后者是一级地址,虽然指向的也是一个地址,但是定义的时候申明的是一级地址。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-01-01
展开全部
int (*p)[4];
数组指针,每个元素都是指针, 每个元素可以指向一个一维数组
int * p
指针, 指向一维数组
数组指针,每个元素都是指针, 每个元素可以指向一个一维数组
int * p
指针, 指向一维数组
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-01-01
展开全部
int (*p)[4];p=a;int *p;p=a[i];//(i=0,1,2)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询