栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多维数组与字符串-(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("%dn", *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("%dn", *p_radius);
    p_radius++;
}

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

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

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

    printf("The address of a[0] is %pn", &a[0]);
    printf("The value in a[0] is %dn", a[0]);
    printf("The address of a[1] is %pn", &a[1]);
    printf("The value in a[1] is %dn", a[1]);

    p = &a[0];

    // 在这里输出 p 和它存储地址对应取出的值
    printf("%p %dn", p, *p);
    // 在这里输出 p + 1 和这一运算后地址及取出的值
    printf("%p %dn", p + 1, *(p + 1));
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/920759.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号