cari

Rumah  >  Soal Jawab  >  teks badan

c++ - 数组地址问题

int a[3] = {0,1,2};

数组a和a[0]的地址是一样的. 但是不同在哪儿呢?用它们的地址进行运算的时候不太一样
那请问, 这样理解对吗?
比如规定数国家省份的时候从西向东数
那新疆是中国的第一个省份, 中国的地址和中国[0](新疆)的地址是一样的。但是用来计算的时候,
中国++; //就变成了朝鲜, 加一变成了跨国家
&中国[0]++; //就变成了青海, 加一只是跨城市

这样理解正确吗?

大家讲道理大家讲道理2773 hari yang lalu430

membalas semua(3)saya akan balas

  • 巴扎黑

    巴扎黑2017-04-17 14:21:53

    地址的值是一样,但是两个数据类型不同,&a[0]的类型是int*,而&a的类型是int (*)[3]

    补充一下数组名a,数组名是指向数组首个元素的指针,所以在你的例子里,a&a[0]是严格相等的(类型一样,值一样),但到了高维数组,你就需要认清首个元素究竟是哪个,比如:{{1, 2, 3}, {4, 5, 6}},首个元素是哪个?1还是{1, 2, 3}

    balas
    0
  • 阿神

    阿神2017-04-17 14:21:53

    提出我的答案

    贴出我本机的运行结果

    #include <stdio.h>
    
    int main() {
        int a[3] = {0, 1, 2};
    
        printf("%p,%p\n", a, &a[0]); 
        printf("%p,%p\n",a+1,&a[0]+1); // 为什么不用,稍后说明
    
        return 0;
    }
    0x7fff5af6e32c,0x7fff5af6e32c
    0x7fff5af6e330,0x7fff5af6e330
    

    结论是 a+1,&a[0]+1 结果是一致的
    那么为什么不用 a++ 呢?

    C 里面变量是 可以进行 ++ 运算的
    但是这里声明了 数组,分配了内存 int a[3] = {0, 1, 2};
    a 已经是常量了,所以不能进行 a++ 运算

    至于 @leunggamciu 说的数据类型不一样
    这个是发生在多维数组里的
    int b2,那么 b +1,其实要加 +3 个int类型,&b +1,只要加 + 1 个int类型长度

    但一维数组里,是一样的,没有区别

    我也是刚学 C 语言不久,万一有什么不对的地方,请一定要指出,谢谢

    balas
    0
  • 大家讲道理

    大家讲道理2017-04-17 14:21:53

    你的数组的地址已经是常量了 ,不能使用自增或自减运算符了,自增运算符应用于左值
    题目中, 语法就是错的。
    我赞成 @leunggamciu 说法, 类型变了, 借@dryyun 的代码

    #include <stdio.h>
    
    int main() {
        int a[3] = {0, 1, 2};
    
        printf("%p,%p\n", a, &a[0]); 
        printf("%p,%p\n",&a+1,&a[0]+1); // 这里的 a在+1前 取地址,
    
        return 0;
    }
    
    题主运行下看看结果吧

    balas
    0
  • Batalbalas