学习笔记(21):C语言 从小白到大神: 入门篇-数组的指针和指向数组的指针变量-3...
立即学习:https://edu.****.net/course/play/8088/176291?utm_source=blogtoedu
1. 指向多维数组的指针和指针变量探究
int a[3][4];
(1)a:是二维数组名,也是整个二维数组的首地址
(2)a+1,a+2:分别代表第一行首地址和第二行首地址
(3)a[0],a[1],a[2]是一维数组名,c语言规定了数组名代表数组的首地址:所以就有如下:
a[0] == &a[0][0]是第0行首地址;
a[1] == &a[1][0]是第一行首地址;
a[2] == &a[2][0]是第二行首地址
(4)第0行第一列元素地址:
可以用&a[0][1],是用a[0] + 1表示
(5)二维数组总结:
a[0] 等价于 *a; a和*a地址都是1000;
a[0]+1 等价于 *a + 1 等价于&a[0][1] 等价于1004;
a[1] 等价于*(a+1)等价于1016
a[1]+2 等价于 *(a+1) + 2 等价于&a[1][2]等价于1024 ,注意啊不要把*(a+1)+2写成*(a+3),那就变成a[3]了
(6)a[0]+1,&a[0][1] ,*a+1,代表第0行第1列元素地址;
那么 *( a[0]+1)就是 a[0][1]的值;*(*a+1)也是a[0][1]的值;
也有 *(a[1]+2),a[1][2],*(*(a+1)+2) 第1行第2列元素值
2. 指针数组和数组指针
(1)指针数组:
int *p[10];
这是个数组,数组中有10个元素,每个元素都是个指针,所以这相当于定义了10个指针,分别为p[0] –p[9];
int a[3][4];
for(int i = 0; i < 3; i++)
{
for(int 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(int i=0; i < 4; i++)
{
printf("value = %d\n",*p[i]);
}
不能使用p = a进行赋值
(2)数组指针:
int (*p) [10];
这是一个指针变量,这个指针变量用来指向含有10个元素的一维数组。
int (*p)[10];
int a[10];
for(int i = 0; i < 10; i++)
{
a[i] = i;
}
p = &a; //注意到这里要用&地址符,否则编译会报错,但&a和a其实值相同。
int *q;
q = (int*)p;
for(int i = 0; i < 10; i++)
{
printf("value = %d\n", *q);
q++;
}
p++; //会跳40个字节
附图(二维数组的各种表示情况):