数组指针与一维数组
数组指针指向的是数组整体,移动的是一个数组的整体空间大小
定义:数据类型 (*变量名) [一维数组元素的个数]
如果不加(),变量名先和[]去结合,变成数组,然后再和*去结合,变成指针,最终变成指针数组
[]的优先级比*的高
例如:
int a[5];
int (*p)[5] = &a;
数组指针和指针数组
数组指针:他是一个指针,指向了一个数组 int (p)[5]
指针数组:他是一个数组,里面存放的都是指针 int p[5]
数组指针的赋值与地址解析
使用取地址符&
来获取数组整体的地址,即&数组名
。
例如:
#include <stdio.h>
int main()
{
int a[5] = {0};
int (*p)[5]= &a;
printf("数组变量名地址:%p\n", a);
printf("数组元素a[0]的地址:%p\n", &a[0]);
printf("数组元素a[1]的地址:%p\n", &a[1]);
printf("对a数组取地址:%p\n", &a);
printf("数组指针保存的地址:%p\n", p);
printf("数组指针跨越此数组空间的地址:%p\n", p+1);
return 0;
}
数组指针的运算
- p+1:往地址增大的方向移动一个数组空间大小,p的指向没有改变
- p-1:往地址减小的方向移动一个数组空间大小,p不改变
- p++:增大的方向一个数组空间大小,p的指向已经改变
- p--:减小的方向移动一个数组空间大小,p改变
用数组指针输入输出元素
#include <stdio.h>
int main()
{
int a[5];
int (p) [5];
p = &a;
printf("输入:");
for(int i = 0; i < 5; i++)
{
// p + i 获取整体空间中的第i+1个空间的地址
// 可以看出一个数组空间空有许多个int型的小空间
scanf("%d", p + i);
}
printf("输出结果:");
for(int i = 0; i < 5; i++)
{
// p + i是一个地址
// 所有用来取得地址里的值
printf("%d ", (*p + i));
}
printf("\n");
return 0;
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/2c51b886758c453cabc91582f212f804.png)
# 数组指针和二维数组
二维数组的本质:数组元素是一维数组的一维数组
> 数组指针指向的是二维数组整体,移动的是一个二维数组的整体空间大小
定义:数据类型 (\*变量名) [二维数组元素的元素的个数]
举例:
```c
int a[2][3];
int (*p)[3]; // 定义一个数组指针
数组指针的赋值与地址解析
使用数组名来获取数组的地址,即数组名
相关地址理解
例如:
#include <stdio.h>
int main()
{
int a[2][3] = {{1, 2, 3}, {9, 8, 7}};
int (*p)[3] = a;
printf("a[0][0]的地址:%p\n", &a[0][0]);
printf("a[0][1]的地址:%p\n", &a[0][1]);
printf("数组a[0]的地址:%p\n", a[0]);
printf("数组a[1]的地址:%p\n", a[1]);
printf("数组a[2][3]的首地址:%p\n", &a[0]);
printf("数组a[2][3]的第二个元素的地址:%p\n", &a[1]);
printf("整个空间的地址:%p\n", &a);
printf("指针的地址:%p\n", p);
printf("下一个整体空间的地址:%p\n", &a + 1);
return 0;
}
用数组指针输入输出元素
#include <stdio.h>
int main()
{
int a[2][3];
int (*p)[3];
p = a;
printf("输入数据:\n");
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 3; j++)
{
scanf("%d", *(p+i)+j);
}
}
printf("输出数据:\n");
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 3; j++)
{
printf("%d ", *(*(p+i)+j));
}
printf("\n");
}
return 0;
}