zoukankan      html  css  js  c++  java
  • 为什么可以对数组名进行 * 和 & 操作

    当一个数组名出现在一个表达式中时,它会被转换为指向该数组第一个元素的指针常量,既然是常量,那么对它进行 & 操作,似乎会有问题。

    1 void main ()
    2 {
    3     int ary[5] = {1, 2, 3, 4, 5};
    4 
    5     printf("%p
    ", ary);
    6     printf("%p
    ", &ary);
    7 }

    编译,运行,一切都很正常。我们都知道,& 操作符的操作对象必须是左值,为什么可以对一个常量进行 & 操作呢?

    可以通过下面这段代码,验证 ary 是一个常量

    1 void main ()
    2 {
    3     int ary[5] = {1, 2, 3, 4, 5};
    4 
    5     printf("%p
    ", ary);
    6     ary++;
    7 }

    编译报错:error C2105: '++' needs l-value

    可以看到,ary 确实是一个常量,可它确实能进行 & 操作,这是怎么回事呢?正向退不出来,我们可以试一下反向推导。

     1 void main ()
     2 {
     3     int ary[2][3] = {
     4         1, 2, 3,
     5         4, 5, 6
     6     };
     7 
     8     printf("sizeof(ary) = %d
    ", sizeof(ary));
     9     printf("ary = %d
    ", ary);
    10 
    11     printf("sizeof(*ary) = %d
    ", sizeof(*ary));
    12     printf("*ary = %d
    ", *ary);
    13 
    14 }

    观察运行结果,ary = *ary, * 号是取指针内容,这个地址存放的内容是 1 ,怎么会相等呢?难道不是取地址内容的意思吗?

    PS:* 号有三种含义,1、乘法;2、定义指针;3、取指针内容

    那其他两种用法就更不靠谱了,难道是一种新的用法?

    在观察,可以发现,sizeof(ary) != sizeof(*ary),他们分别是24和12,我们似乎发现了什么,24 = 2*3*4,12 = 3*4。

    结论:当 * 号作用于数组名的时候,类型改变,而值不变,* 号表示解除引用的意思。有加法必有减法,同理,可以对数组名做 * 操作,那么就可以对数组名做 & 操作,表示改变地址的类型。这就可以解释,为什么可以对数组名这个常量进行 & 操作,值不变,类型发生变化。

    总结:对数组名的 & 和 * 操作,值不变,指针升级或降级。

  • 相关阅读:
    日记 2018/1/12
    【程序员笔试面试必会——排序①】Python实现 冒泡排序、选择排序、插入排序、归并排序、快速排序、堆排序、希尔排序
    Python笔试、面试 【必看】
    高性能Go并发
    Go连接MySql数据库Error 1040: Too many connections错误解决
    MAC 配置文件 ~/.zshrc
    go-statsd项目
    日记 2017.11.20
    sed 命令详解
    Opentsdb简介(一)
  • 原文地址:https://www.cnblogs.com/luzhiyuan/p/3636613.html
Copyright © 2011-2022 走看看