为什么*str1和*(&str1),其中str是C中char数组的名称,不会评估相同的结果?

-1 c arrays pointers memory-address

代码很简单但我不明白它是如何工作的.所有三个变量似乎都存储在同一个地址,也许str1只是str [0]的别名,但是当我尝试取消引用它们时,我会得到不同的结果.

   #include <stdio.h>

    int main() {
        char str1[] = "Hello";

        printf("<========Addresses: =======> \n");
        printf("%d\n", &str1[0]);
        printf("%d\n", &str1);
        printf("%d\n", str1);

        printf("<========Values stored at the address(?!)=======> \n");
        printf("%d\n", *(&str1[0]));
        printf("%d\n", *(&str1));
        printf("%d\n", *str1);
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

这就是它打印的内容.

<========地址:=======>

6356458

6356458

6356458

<========值>存储在地址=======>

72

6356458

72

Som*_*ude 5

首先让我们看看你的指针:

  1. &str1[0]:这是指向数组的第一个元素的指针.它的类型是char *.

  2. &str1:这是一个指向数组本身的指针.它的类型是char (*)[6](不要忘记C中的字符串是以null结尾的,并且终结符也需要空间).

  3. str1:这将衰减为指向数组第一个元素的指针,并且完全等于&str1[0](即第一个元素).

现在我们知道第一个和第三个指针是指向数组中单个元素的指针(索引处的第一个指针0),很容易看到当我们用一元运算*符取消引用它时会发生什么:我们得到元素的值指针指向.这是字母'H',它们具有价值72ASCII编码.

解释结果*(&str1)实际上相当简单,因为我们可以删除括号并得到*&str1.然后很容易看出运算符的取消引用和地址将相互抵消,留给我们str1.并且str1,如上所述,等于&str1[0],即指向阵列中第一个元素的指针.