9.6 数组的指针和指向数组的指针变量 - 3
- 一.回顾二维数组和多维数组的概念
- 二.指向多维数组的指针和指针变量探究
- 1.a:二维数组名,也是整个二维数组的首地址。我们可以认为是第0行的首地址是1000
- 2.a+1 , a+2 分别代表第一行首地址和第二行首地址。
- 3.这表示a[0],a[1],a[2]是一维数组名。
- (1) a[0] == &a[0][0] == 1000 是第0行元素首地址
- (2) a[1] == &a[1][0] == 1016 是第1行元素首地址
- (3) a[2] == &a[2][0] == 1032 是第2行元素首地址
- 4.第0行第1列元素,地址怎么表示
- 5.int a[5];一些推论
- (1)a[0] 等价于*a; 都是地址1000,我们注意到a,*a,也是都是1000
- (2)a[0] +1等价于*a+1; 等价于 &a[0] [1],等价于1004
- (3)a[1],等价于*(a+1),等价于1016
- (4)a[1]+2,等价于*(a+1)+2,等价于 &a[1] [2],等价于1024
- 6.a[0] +1等价于*a+1; 等价于 &a[0] [1],等价于1004,这是个地址
- (1)*(a[0] +1)就代表a[0][1]的值; *(*a+ 1) 也是a[0][1]的值
- (2)*(a[1] + 2),a[1][2]的值,*(*(a+1)+ 2),都表示第1行第2列元素值
- 三.指针数组和数组指针
- 1. 指针数组
- 2.数组指针
- 四.多维数组的指针做函数参数
- 五.整理来源
一.回顾二维数组和多维数组的概念
a[3][4];
内存中:
a[2][3][4];
二.指向多维数组的指针和指针变量探究
//可以把a看成一个一维数组,这个一维数组有三个元素: a[0] ,a[1], a[2],每个元素又是一个包含4个元素的一维数组。
1.a:二维数组名,也是整个二维数组的首地址。我们可以认为是第0行的首地址是1000
int main()
{
int a[3][4]; //数组名a 同样代表数组的首地址
int *p;
p = (int *)a; //强制转换,p指向数组的首地址
return;
}
2.a+1 , a+2 分别代表第一行首地址和第二行首地址。
所以a+1跳过16个字节,也就是 a = 1000,a+ 1 = 1016;
int main()
{
int a[3][4]; //数组名a 同样代表数组的首地址
int *p;
p = (int *)(a+1);
p = (int *)(a+2);
return;
}
0x0034fc6c a的地址 1000
0x0034fc7c a+1的地址 1016
0x0034fc8c a+2的地址 1032
3.这表示a[0],a[1],a[2]是一维数组名。
C语言规定数组名代表数组的首地址,所以就有如下:
(1) a[0] == &a[0][0] == 1000 是第0行元素首地址
(2) a[1] == &a[1][0] == 1016 是第1行元素首地址
(3) a[2] == &a[2][0] == 1032 是第2行元素首地址
int main()
{
int a[3][4]; //数组名a 同样代表数组的首地址
int *p;
p = a[0]; //地址:0x0042f7cc
p = a[1]; //地址:0x0042f7dc
return;
}
4.第0行第1列元素,地址怎么表示
&a[0][1], a[0] + 1; --1004
int main()
{
int a[3][4]; //数组名a 同样代表数组的首地址
int *p;
p = &a[0][1]; //地址:0x000ffb30
p = a[0] + 1; //地址:0x000ffb30
return;
}
5.int a[5];一些推论
(1)a[0] 等价于*a; 都是地址1000,我们注意到a,*a,也是都是1000
(2)a[0] +1等价于*a+1; 等价于 &a[0] [1],等价于1004
(3)a[1],等价于*(a+1),等价于1016
(4)a[1]+2,等价于*(a+1)+2,等价于 &a[1] [2],等价于1024
注意,不要把*(a+1)+2写成*(a+3),那就变成a[3];
6.a[0] +1等价于*a+1; 等价于 &a[0] [1],等价于1004,这是个地址
(1)*(a[0] +1)就代表a[0][1]的值; *(*a+ 1) 也是a[0][1]的值
(2)(a[1] + 2),a[1][2]的值,(*(a+1)+ 2),都表示第1行第2列元素值
a[i]的性质问题:
a[i] 和 &a[i]地址是一样的
实例:
int main()
{
int a[3][4]; //数组名a 同样代表数组的首地址
int i,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 4;j++)
{
a[i][j] = 86;
}
}
int *p;
p = (int *)(a+1); //第一行首地址; //a[1][0]....a[1][3]
*p = 56; //a[1][0] = 56
p++; //走4个字节 a[1][1]
*p = 78; //相当于a[1][1] = 78;
return;
}
三.指针数组和数组指针
1. 指针数组
//首先这是个数组,数组中有10个元素,每个元素都是个指针,所以这相当于定义了10个指针变量,也就是p[0]-p[9];
int *p[10]; //能引用的下标是[0]-[9]
int main()
{
int a[3][4]; //数组名a 同样代表数组的首地址
int i,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 4;j++)
{
a[i][j] = 86;
}
}
int *p[4]; //指针数组,能引用的下标[0]-[3]
p[0] = &a[0][0];
p[1] = &a[0][1];
p[2] = &a[0][2];
p[3] = &a[0][3];
for(j = 0;j < 4;j++)
{
printf("value = %d\n",*(p[j]));
}
return;
}
2.数组指针
int (*p)[10];是一个指针变量,这个指针变量用来指向含有10个元素的一维数组。
int main()
{
int (*p)[10];
int a[10]; //数组名a 同样代表数组的首地址
int i,j;
for(i = 0;i < 10;i++)
{
a[i] = i;
}
p = &a; //&地址符
int *q;
q = (int *)p;
for(j = 0;j < 10;j++)
{
printf("value = %d\n",*q);
q++;
}
return;
}
int main()
{
int (*p)[10];
int a[3][10]; //数组名a 同样代表数组的首地址
int i,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 10;j++)
{
a[i][j] = i+j;
}
}
p = a; //二维数组名可以直接赋值给数组指针
int *q;
q = (int *)p;
for(i = 0;i < 3;i++)
{
q = *(p +i); // 每次指向一个新行
for(j = 0;j < 10;j++)
{
printf("value = %d\n",*q);
q++;
}
printf("--------------\n");
p++; //跳40个字节
q = (int *)p;
}
return;
}
int main()
{
int (*p)[10];
int a[3][10]; //数组名a 同样代表数组的首地址
int i,j;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 10;j++)
{
a[i][j] = i+j;
}
}
p = a; //二维数组名可以直接赋值给数组指针
int *q;
q = (int *)p;
for(i = 0;i < 3;i++)
{
for(j = 0;j < 10;j++)
{
printf("value = %d\n",*(*(p+i)+j));
}
printf("--------------\n");
p++; //跳40个字节
q = (int *)p;
}
return;
}
四.多维数组的指针做函数参数
五.整理来源
整理至https://appd872nnyh9503.pc.xiaoe-tech.com/index的笔记