数组内存
在 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);
- 可以运行一下程序,验证一下通过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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76945.html