吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 595|回复: 1
上一主题 下一主题
收起左侧

[学习记录] 详解C语言数组指针

[复制链接]
跳转到指定楼层
楼主
nbzlk 发表于 2022-11-15 09:37 回帖奖励

数组指针与一维数组

数组指针指向的是数组整体,移动的是一个数组的整体空间大小

定义:数据类型 (*变量名) [一维数组元素的个数]
如果不加(),变量名先和[]去结合,变成数组,然后再和*去结合,变成指针,最终变成指针数组
[]的优先级比*的高
例如:

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

在这里插入图片描述

免费评分

参与人数 1吾爱币 +1 收起 理由
arm1024 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
hkhkhk 发表于 2022-11-15 11:05
谢谢分享有点简单
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 03:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表