voliate修饰数组有作用吗_为什么两个数组不能直接赋值?const详解

ebc4b59463f74d8fb30b08dd03264ecf.png
看前点赞 养成习惯
学习编程,想看干货,关注公众号:不会编程的程序圆

指针 关于const

const

数组变量 是 const 的指针

在初学数组时,我们都有这样的思考:既然变量可以互相赋值,那么 数组 可以相互赋值吗?
比如说:

int a = 1;
int b = 2;
int arr1[3] = {1, 2, 3};
int arr2[3] = {0};
b = a;//ok
arr2 = arr1;//error

一但这么些程序就会报错,为什么会这样呢?

这是因为,以上面的为例: int arr2[3] = {0}在编译器看来其实是这样的: int* const arr2 上一篇我们也学到了,const在 * 后 const 修饰的是地址 arr2,因此arr2是不能被改变的

`int* const arr` 与 `int arr[]`是否可以划等号?

我们先来看下面这个程序:

int main() {

    int arr[3] = { 1, 2, 3 };
    int* const q = arr;

    printf("arr  = %pn", arr);
    printf("&arr = %pn", &arr);

    printf("q    = %pn", q);
    printf("&q   = %pn", &q);

}

这个程序里,arr 的值与 q 的值相同我们应该是提前都会想到的。问题就是 这个 arr 的地址 与 q 的地址问题。他们会相同吗?虽然他们都指向 arr,但是这是两个不同的指针变量,所以他们的地址肯定是不会相同的。请看在我的机器上输出结果:

arr  = 004FF824
&arr = 004FF824
q    = 004FF824
&q   = 004FF818

&arr 竟然与 arrq 是一样的! 为什么会 这样?&arrarr 有什么区别?请看下面的程序:

int main() {

    int arr[3] = { 1, 2, 3 };
    int* const q = arr;

    printf("arr      =   %pn", arr);
    printf("&arr     =   %pn", &arr);

    printf("arr + 1  =   %pn", arr + 1);
    printf("&arr + 1 =   %pn", &arr + 1);

    printf("%dn", ((int)(&arr + 1) - (int)(&arr)));//将指针转变为int,看地址相差多少

    printf("q        =   %pn", q);
    printf("&q       =   %pn", &q);

    printf("&q + 1   =   %pn", &q + 1);

}

arr      =   0020F860
&arr     =   0020F860
arr + 1  =   0020F864
&arr + 1 =   0020F86C
12
q        =   0020F860
&q       =   0020F854
&q + 1   =   0020F858

&arr + 1arr + 1差了 12 个字节, 刚好是一整个arr数组的长度。这意味着什么?

取数组的地址 实际上 取走的是 ==整个数组==的 地址,它将整个数组视为整体,对它进行加减,大小是整个数组的大小
&q + 1得值仅仅变化了 4 个字节 ,就是一个指针的大小

<关于const 在程序中的使用教学 后续会在本编中加上 ,敬请期待 !>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值