c语言中,关于指针int(*p)[4]和int*p指向二维数组a[3][4]初始化的问题。

高手有没有人讲详细点的,我想说下,c语言中,关于指针int(*p)[4]和int*p指向二维数组a[3][4]初始化的问题。
最新回答
灿烂星空

2024-10-22 06:24:05

二维数组相当于多行列数相同的一位数组组合起来;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");
}

}

结果
风清梵

2024-10-22 06:26:02

还是我来告诉你吧!前者是二级地址,就是地址的地址。后者是一级地址,虽然指向的也是一个地址,但是定义的时候申明的是一级地址。
路人

2024-10-22 06:46:16

int (*p)[4];
数组指针,每个元素都是指针, 每个元素可以指向一个一维数组
int * p
指针, 指向一维数组
我历史不好别跟我提以往

2024-10-22 07:16:02

int (*p)[4];p=a;int *p;p=a[i];//(i=0,1,2)