数组指针才真正等同于二维数组名
数组指针:
当运行下面的代码的时候,会有警告,偏移量不同,arr++偏移的是整行数组,与注释的p++不同,如果p=&arr[0][0],p++表示的就是依次、连续的12个元素地址,偏移一个整型变量;因为数组元素是连续的地址空间,结果就会从arr[0][0]开始输出完整的12个数据,换成p=arr,arr++ 就会发出警告;解决的方法就是:运用数组指针,这样就与p++的情况相通了
直接运行,虽然能得到结果但是会有警告;如下
#include <stdio.h>
int main()
{/*数组指针的应用 */int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}}; //12个元素是连续的int i,j;int *p;// p=&arr[0][0];p=arr;//能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?//数组指针,定义一个指针,指向一个数组for ( i = 0; i < 3; i++){for (j = 0; j < 4; j++){// printf("%p\n",arr[i]+j);printf("%p\n",*p++);//第i行第j列元素的地址}}
}//输出有警告
warning: assignment to 'int *' from incompatible pointer type 'int (*)[4]' [-Wincompatible-pointer-types]p=arr;^
添加数组指针后:
#include <stdio.h>
int main()
{/*数组指针的应用 */int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}}; //12个元素是连续的int i,j;//int *p;// p=&arr[0][0];int (*p2)[4];p2=arr;//能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?//数组指针,定义一个指针,指向一个数组for ( i = 0; i < 3; i++){for (j = 0; j < 4; j++){// printf("%p\n",arr[i]+j);printf("%p\n",*(arr+i)+j);//第i行第j列元素的地址}}
}
//成功输出元素的地址
000000000061FDE0
000000000061FDE4
000000000061FDE8
000000000061FDEC
000000000061FDF0
000000000061FDF4
000000000061FDF8
000000000061FDFC
000000000061FE00
000000000061FE04
000000000061FE08
000000000061FE0C
发现问题:发现p2与++p2的地址输出结果相同。分析:printf是从右往左开始输出打印的,先进行++p2后再p2,暂时先分开写
#include <stdio.h>
int main()
{/*数组指针的应用 */int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}}; //12个元素是连续的int i,j;int *p;// p=&arr[0][0];int (*p2)[4]; //p2相当于一个一维数组了呀,p2=arr;//能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?//数组指针,定义一个指针,指向一个数组printf("p2:%p,p2++=%p\n",p2,++p2);for ( i = 0; i < 3; i++){for (j = 0; j < 4; j++){// printf("%p\n",arr[i]+j);// printf("%d\n",(*(arr+i)+j));//第i行第j列元素的地址}}
}
p2:000000000061FDF0,p2++=000000000061FDF0 //发现p2与++p2的地址输出结果相同
#include <stdio.h>
int main()
{/*数组指针的应用 */int arr[3][4] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}}; //12个元素是连续的int i,j;int *p;// p=&arr[0][0];int (*p2)[4]; //p2相当于一个一维数组了呀,p2包含4个元素的数组指针p2=arr;//能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?//数组指针,定义一个指针,指向一个数组printf("p2: %p\n",p2);printf("++p2:%p\n",++p2);for ( i = 0; i < 3; i++){for (j = 0; j < 4; j++){// printf("%p\n",arr[i]+j);// printf("%d\n",(*(arr+i)+j));//第i行第j列元素的地址}}
}
p2: 000000000061FDE0
++p2:000000000061FDF0 //变了16,因为一行数组有四个元素
//能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?
//数组指针,定义一个指针,指向一个数组
//数组指针才真正等同于二维数组名
#include <stdio.h>
int main()
{/*数组指针的应用 */int arr[3][5] = {{11,22,33,44},{12,13,15,16},{22,66,77,88}}; //12个元素是连续的int i,j;int *p;// p=&arr[0][0];int (*p2)[5]; //p2相当于一个一维数组了呀,p2包含4个元素的数组指针p2=arr;//能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?//数组指针,定义一个指针,指向一个数组//数组指针才真正等同于二维数组名printf("p2: %p\n",p2);printf("++p2:%p\n",++p2);for ( i = 0; i < 3; i++){for (j = 0; j < 4; j++){// printf("%p\n",arr[i]+j);// printf("%d\n",(*(arr+i)+j));//第i行第j列元素的地址}}
}