详解C语言数组指针
# 数组指针与一维数组> 数组指针指向的是数组整体,移动的是一个数组的整体空间大小
定义:数据类型 (\*变量名) [一维数组元素的个数]
*如果不加(),变量名先和[]去结合,变成数组,然后再和\*去结合,变成指针,最终变成指针数组*
[]的优先级比*的高
例如:
```c
int a;
int (*p) = &a;
```
## 数组指针和指针数组
数组指针:他是一个指针,指向了一个数组 int (*p)
指针数组:他是一个数组,里面存放的都是指针 int *p
## 数组指针的赋值与地址解析
使用取地址符`&`来获取数组整体的地址,即`&数组名`。
例如:
```c
#include <stdio.h>
int main()
{
int a = {0};
int (*p)= &a;
printf("数组变量名地址:%p\n", a);
printf("数组元素a的地址:%p\n", &a);
printf("数组元素a的地址:%p\n", &a);
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改变
## 用数组指针输入输出元素
```c
#include <stdio.h>
int main()
{
int a;
int (*p) ;
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;
}
```

# 数组指针和二维数组
二维数组的本质:数组元素是一维数组的一维数组
> 数组指针指向的是二维数组整体,移动的是一个二维数组的整体空间大小
定义:数据类型 (\*变量名) [二维数组元素的元素的个数]
举例:
```c
int a;
int (*p); // 定义一个数组指针
```
## 数组指针的赋值与地址解析
使用数组名来获取数组的地址,即`数组名`
相关地址理解

例如:
```c
#include <stdio.h>
int main()
{
int a = {{1, 2, 3}, {9, 8, 7}};
int (*p) = a;
printf("a的地址:%p\n", &a);
printf("a的地址:%p\n", &a);
printf("数组a的地址:%p\n", a);
printf("数组a的地址:%p\n", a);
printf("数组a的首地址:%p\n", &a);
printf("数组a的第二个元素的地址:%p\n", &a);
printf("整个空间的地址:%p\n", &a);
printf("指针的地址:%p\n", p);
printf("下一个整体空间的地址:%p\n", &a + 1);
return 0;
}
```

## 用数组指针输入输出元素
```c
#include <stdio.h>
int main()
{
int a;
int (*p);
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;
}
```
 谢谢分享有点简单
页:
[1]