指针和二维数组的关系
一、用数组名访问二维数组
二维数组可以看作是特殊的一维数组
int a[3][4] = { {1,3,5,7}, {9,11,13,15} ,{17,19,21,23} };
a代表数组的首地址
a[0]代表数组的第0行的首地址,也代表数组第0列的首地址,它和数组的首地址相同
a[0]+1代表数组的第1列的首地址, a[0]+1代表第2列首地址 a[0]+j代表列号为j的列的首地址
a+1代表数组的第1行的首地址 ,a+2代表第2行首地址,a+i代表行号为i的行首地址(按行变化)
#include <stdio.h>
#include <stdlib.h>
int main()
{
//定义数组
int a[3][4] = {{1,3,5,7}, {9,11,13,15} ,{17,19,21,23}};
//打印二维数组的列指针
printf("&a[0][0] = %p\n",&a[0][0]);
printf(" a[0] = %p\n",a[0]);
printf("&a[0][1] = %p\n",&a[0][1]);
printf(" a[0]+ 1 = %p\n",a[0]+1);
printf("&a[0][2] = %p\n",&a[0][2]);
printf(" a[0]+ 2 = %p\n",a[0]+2);
printf("&a[0][3] = %p\n",&a[0][3]);
printf(" a[0]+ 3 = %p\n",a[0]+3);
//打印行指针 a[0] a[1] a[2]
//a+1 是第二行的首地址
//a+2 是第三行的首地址
printf("a[0] = %p\n",a[0]);
printf(" a = %p\n",a);
printf("a[1] = %p\n",a[1]);
printf("a +1 = %p\n",a+1);
printf("a[2] = %p\n",a[2]);
printf("a +2 = %p\n",a+2);
system("pause");
return 0;
}
a[i]+j获取的是a [i] [j]的地址,
*(a[i]+j)获取的是a [i] [j]的值,加 * 表示取值
a [i]获取值得方式为: * (a+i)
* ( * (a+i)+j ); 获取的是a[i][j]的值
#include <stdio.h>
#include <stdlib.h>
int main()
{
//定义数组
int a[3][4] = {{1,3,5,7}, {9,11,13,15} ,{17,19,21,23}};
int i,j;
//控制行
for(i = 0; i < 3; i++)
{
//控制列
for(j = 0; j < 4; j++)
{
//打印出数组元素
printf("%d\t",a[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
//定义数组
int a[3][4] = {{1,3,5,7}, {9,11,13,15} ,{17,19,21,23}};
int i,j;
//定义一个为数组指针并指向数组a[3][4]
int (*p)[4] = a;
//控制行
for(i = 0; i < 3; i++)
{
//控制列
for(j = 0; j < 4; j++)
{
//打印出数组元素
printf("%d\t", *(*(a+i)+j));
}
printf("\n");
}
system("pause");
return 0;
}
二、用普通指针访问二维数组
此方法不推荐使用,能访问二维数组是因为二维数组在内存中存储的时候是每个元素是逐个线性存储的,不推荐使用时因为:定义的是一级指针指向了二维数组
#include <stdio.h>
#include <stdlib.h>
int main()
{
//定义数组
int a[3][4] = {{1,3,5,7}, {9,11,13,15} ,{17,19,21,23}};
int i,j;
int *p = a;
for(i = 0; i < 12; i++)
{
//打印出数组元素
printf("%d\t",*(p+i));
}
printf("\n");
system("pause");
return 0;
}
三、二维数组指针
二维数组指针:指向二维数组的指针,存放的是二维数组的每一行的首地址,二维数组指针是二级指针
一般形式:
数据类型 (*行指针变量名)[数组第二位的长度]
int a[3][4];
int (*p)[4];
表示定义一个二维数组指针,指向含有4个元素的一维数组
p = a;
表示将该二维数组的首地址赋给p,也就是a[0]或者&a[0][0]
p++
可 以让指针指向数组的每一行
数组指针也称指向一维数组的指针,也称作行指针
#include <stdio.h>
#include <stdlib.h>
int main()
{
//定义数组
int a[3][4] = {{1,3,5,7}, {9,11,13,15} ,{17,19,21,23}};
int i,j;
//定义一个为数组指针并指向数组a[3][4]
int (*p)[4] = a;
//控制行
for(i = 0; i < 3; i++)
{
//控制列
for(j = 0; j < 4; j++)
{
//打印出数组元素
printf("%d\t", *(*(p+i)+j));
}
printf("\n");
}
system("pause");
return 0;
}
三、指针数组和二维数组指针的区别
1、int *p[3] = { &a,&b,&c }; p 是一个指针数组,用来存放指针的数组,本质是数组,只不过数组的每个元素是指针变量
2、int (*p)[3] = a; 是二维数组指针,指向二维数组的指针变量,本质是指针,指向的是一个二维数组
3、两者都可以用来表示二维数组
4、二维数组指针变量是单个的变量,只能存放一个二维数组的地址
5、int (*p)[3];表示是定义一个 二维数组指针,指向了含有3个元素的一维数组
6、指针数组是多个有序指针