nbzlk 发表于 2022-11-15 09:37

详解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;
}

```
![在这里插入图片描述](https://img-blog.csdnimg.cn/ce5b4106c81747cc928766b24bc4e1ee.png)
## 数组指针的运算
- 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;
}

```
![在这里插入图片描述](https://img-blog.csdnimg.cn/2c51b886758c453cabc91582f212f804.png)
# 数组指针和二维数组
二维数组的本质:数组元素是一维数组的一维数组
> 数组指针指向的是二维数组整体,移动的是一个二维数组的整体空间大小

定义:数据类型 (\*变量名) [二维数组元素的元素的个数]
举例:

```c
int a;
int (*p); // 定义一个数组指针
```

## 数组指针的赋值与地址解析
使用数组名来获取数组的地址,即`数组名`
相关地址理解
![在这里插入图片描述](https://img-blog.csdnimg.cn/832ee887892640c1bd35c0f44b1d01e1.png)
例如:
```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;
}
```
![在这里插入图片描述](https://img-blog.csdnimg.cn/c6df6508a9e348d680095770463a1652.png)
## 用数组指针输入输出元素
```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;
}

```
![在这里插入图片描述](https://img-blog.csdnimg.cn/dac1b465ff86453a97d0904a9e7a7c07.png)

hkhkhk 发表于 2022-11-15 11:05

谢谢分享有点简单
页: [1]
查看完整版本: 详解C语言数组指针