关于数组指针与指针数组的理解()

1、数组指针:首先从字面意思上理解后面两个字是指针,前面两个字起修饰作用。比较官方(教材)的理解这是一个指向数组的指针,同其他指向变量的指针没有什么区别,只不过指向的是数组。格式上的表现:int (*p)[ ];下面来点代码详细解释:

#include<stdio.h>
int main()
{
int arr[2][3]={1,2,3,4,5,6};//定义一个二维数组
int i,j;//用于操作二维数组的循环变量
int (*p)[3];//定义一个数组指针
p=arr;//指针赋值,将数组指针p指向arr这个数组
for(i=0;i<2;i++)//两层循环第一层
{
for(j=0;j<3;j++)//两层循环第二层
{
printf("arr[%d][%d]=%d\n",i,j,p[i][j]);
}
}
return 0;
}

**其中,在p=arr;这一行,定义的p是一个指向三个变量的数组,在arr中的数据是两行三列的二维数组,因此可以看成是p指向了arr下标为0的那一行(每一行都含有三个数字,满足p的赋值)。在p[i][j]这个命令中,我们可以用for( i=0;i<2;i++)来完成对arr数组的两行数据的输出。在这些或许会有个疑问,我们定义的P在初始化的时候只给了arr数组的下标为0的那一行的三个元素,并没有给他赋arr下标为1的那一行的三个元素,为啥还能把第二行的三个元素打印出来呢?在解决这个问题之前我们要搞清楚,我们定义的p是一个指向内部含有三个元素的数组,二维数组其实相当于多行一维数组的叠加,当循环进行到数组第二行的时候碰p[i][j]变成了p[1][j],指针p就像被重新初始化到了第二行里面的三个数据,但其实指针是没有发生变化的,可以这样理解。里面同样有三个数,满足P的格式,所以这个是没有问题的。
2、指针数组
指针数组是数组,官方理解就是一个数组里的每一个元素都是指针变量;
int *p(5)={“spring”,“summer”,“autumn”,“winter”};
int i;
for(i=0;i<5;i++)
{
printf("%s\n",p[i]);//用printf函数输出%s时,后面的输出列表要跟地址。
}

猜你喜欢

转载自blog.csdn.net/qq_46093320/article/details/105176809
今日推荐