c - 为什么* str1和*(&str1)的str是C语言中的char数组的名称,为什么没有得出相同的结果?

标签 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;
    }


这就是它的打印内容。


  <========地址:=======>
  
  6356458
  
  6356458
  
  6356458
  
  <========值存储在地址=======>
  
  72
  
  6356458
  
  72

最佳答案

首先让我们看一下您拥有的指针:


&str1[0]:这是指向数组第一个元素的指针。其类型为char *
&str1:这是指向数组本身的指针。它的类型是char (*)[6](别忘了C中的字符串以null终止,并且终止符也需要空间)。
str1:这将衰减为指向数组第一个元素的指针,并且完全等于&str1[0](即第一个)。


现在我们知道第一个指针和第三个指针是指向数组中单个元素的指针(第一个指针位于索引0),很容易看出用一元*运算符取消引用时会发生什么:指针指向的元素的值。这是字母'H',在ASCII编码中其值为72

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

关于c - 为什么* str1和*(&str1)的str是C语言中的char数组的名称,为什么没有得出相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53981840/

相关文章:

c - 如何使可变大小的二维数组指向(并表示)c 中一维数组的起始地址?

c - 如何正确实现c malloc/realloc函数?

php - PHP的foreach打印多维数组到表?

c - 移动一段 malloc 内存的最简单方法

c - JNI ThrowNew 什么时候会失败?

javascript - 将字符串拆分为每个索引的 n 个单词的数组

c - 需要帮助将文件内容扫描到指针数组中

c - 将 char 缓冲区分配给指针数组

delphi - 如果 "dangling pointers"做不到,如何检测 "Assigned()"?

c++ - c++ 中的 "new"运算符,指针问题