学不死就死里xue 发表于 2022-11-23 18:53:41

关于整个数组地址的疑惑

array 是数组第一个元素的地址,所以 array + 1 指向数组第二个元素;&array 是整个数组的地址,所以 &array + 1 指向整个数组最后的位置。


这里的&array+1是啥意思呀数组最后的位置
那加2是什么
加3呢

人造人 发表于 2022-11-23 18:57:52

看一下这个输出是不是就能理解了

sh-5.1$ cat main.c
#include <stdio.h>

int main(void) {
    int a = {1, 2, 3, 4, 5};
    printf("%p\n", &a);
    printf("%p\n", &a + 1);
    printf("%p\n", &a + 2);
    printf("%p\n", &a + 3);
    return 0;
}
sh-5.1$ ./main
0x7fff823812f0
0x7fff82381304
0x7fff82381318
0x7fff8238132c
sh-5.1$

jackz007 发表于 2022-11-23 19:10:40

本帖最后由 jackz007 于 2022-11-23 19:33 编辑

      int array
   array 属于一个二级指针,& array 就是一个三级指针(int (*)),相当于为 array 新增加了一维,& array 每加减 1 的跨度是整个 array 数组(int (*)),例如,& array + 1 指向 array 数组结束的位置(不是最后一个元素)。就是说,它指向的是下一个 array(如果存在的话)的第一个元素,如果加 2,那自然就是指向下下个 array 的第一个元素,加 3 指向再下一个 array 的第一个元素,余此类推。

竹逸 发表于 2022-11-23 19:45:30

本帖最后由 竹逸 于 2022-11-23 20:48 编辑

int a = {1, 2, 3, 4, 5};
数组名a在不和&和sizeof发生关系时,默认为数组的首地址(首元素地址),该地址存储的是int型数据,一个int型数据占4个字节,也就是说int型数据都是以4个字节为1个单位进行读取和存储的,a+1,这个1是相对于首地址的偏移量,即偏移了1个单位(4字节),所以a+1表示 首地址+相对于首地址的偏移量(4字节),得到的是一个新的地址,也就是指向下一个int型数据的地址,即指向a的地址,数组下标就是相对于首地址的偏移量

a和&发生关系时,a就不会被转换成首元素地址,而是代表整个数组,&a就是取整个数组的地址,这个地址上存储的数据横跨了整个数组,是以整个数组作为1个单位,&a+1,就是偏移了整个数组作为1个单位的长度,指向了下一个数组的首地址
页: [1]
查看完整版本: 关于整个数组地址的疑惑