多维数组与字符串-(C语言)

数组内存

在 C 语言中,无论数组内的元素是什么类型的,对一个元素的地址加一个位移值 n 得到的就是这个元素往后数 n 后所在元素的地址
一般来说,我们通过在地址上进行运算的方式访问数组的效率是比用数组索引的方式执行更快的。同时,它在一些特殊场景下也会让你写起来觉得很方便。例如,当你只希望访问数组中的每一个元素一次时,你可以通过在一个while循环内使用地址上运算的方式使用数组中每一个元素的值,而无需去关心数组的索引是谁……
在这里插入图片描述
在这里插入图片描述

// 举个例子方便你直观理解
int n = 3;
int radius[3] = {34, 66, 233};
int *p_radius;

p_radius = &radius[0];
while (n != 0) {
    n--;
    printf("%d\n", *p_radius);
    p_radius++;
}

从变量到数组

在这里插入图片描述
在这里插入图片描述
在之前我们提到过,一个数组其实与一系列同类型的变量类似。变量在内存中有自己的地址,我们可以通过&得到它。而对于数组来说,它的每一个元素也有着自己的地址,更为有趣的是,数组在内存中会占用一个连续的区域,所以它的每一个元素的地址也是相邻的。
当我们通过int r a d i u s [ 3 ] radius[3] radius[3]定义一个长度为 3 的数组时,我们实际上定义了 3 个地址相邻的元素。
在这里插入图片描述
与取变量地址的方式一致,我们可以通过&radius[1]的方式取得数组radius在索引位置 1 元素的地址。

变量之间的关联

在这里插入图片描述
因为我们声明数组时的类型是int,相应地,我们也可以声明一个int *p_radius变量来存储&radius[0]的地址:

int *p_radius;
p_radius = &radius[0];

取值与取地址

在这里插入图片描述
如果这时候,我们进行下面的输出:

printf("%d", *p_radius);

根据之前学习过的取值符号*,我们将会得到radius[0]元素的值。

地址上的运算

在这里插入图片描述

p = &radius[0];

在 C 语言中,定义了一种在地址上进行运算的方式,如果我们已经有了上面列出的语句,这时候如果通过$printf(“%d”,(p_radius+1));或printf(“%d”,(&radius[0]+1));进行输出,我们都会得到radius[1]元素的值,因为p_radius+1和&radius[0]+1的这种计算实际上都会得到radius[1]元素的地址。
类似的,p_radius+2、&radius[0]+2或&radius[1]+1都会得到radius[2]元素的地址。
在这里插入图片描述
在 C 语言中,无论数组内的元素是什么类型的,对一个元素的地址加一个位移值 n 得到的就是这个元素往后数 n 后所在元素的地址。
一般来说,我们通过在地址上进行运算的方式访问数组的效率是比用数组索引的方式执行更快的。同时,它在一些特殊场景下也会让你写起来觉得很方便。例如,当你只希望访问数组中的每一个元素一次时,你可以通过在一个while循环内使用地址上运算的方式使用数组中每一个元素的值,而无需去关心数组的索引是谁……

// 举个例子方便你直观理解
int n = 3;
int radius[3] = {34, 66, 233};
int *p_radius;

p_radius = &radius[0];
while (n != 0) {
    n--;
    printf("%d\n", *p_radius);
    p_radius++;
}

我们刚刚了解一下数组和地址的关系,在这一节给出的代码中,我们可以看到,程序一开始输出了a[0]和a[1]的地址与值。在之后,程序声明了一个用接下用于存储地址的变量p, 并用它存储了数组元素a[0]地址。
接下来,我们先把p的值和它取出的值输出:

printf("%p %d\n", p, *p);
  1. 可以运行一下程序,验证一下通过p 输出的地址和值与给定代码中直接输出的a[0] 的地址和值是否一致。 接下来,让我们来实践一下地址上做运算以后得到的结果,请输入:
printf("%p %d\n", p + 1, *(p+1));
#include <stdio.h>

int main() {
    int a[3] = {1, 2, 3};
    int *p;

    printf("The address of a[0] is %p\n", &a[0]);
    printf("The value in a[0] is %d\n", a[0]);
    printf("The address of a[1] is %p\n", &a[1]);
    printf("The value in a[1] is %d\n", a[1]);

    p = &a[0];

    // 在这里输出 p 和它存储地址对应取出的值
    printf("%p %d\n", p, *p);
    // 在这里输出 p + 1 和这一运算后地址及取出的值
    printf("%p %d\n", p + 1, *(p + 1));
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值