-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
首先让我们看看你的指针:
&str1[0]:这是指向数组的第一个元素的指针.它的类型是char *.
&str1:这是一个指向数组本身的指针.它的类型是char (*)[6](不要忘记C中的字符串是以null结尾的,并且终结符也需要空间).
str1:这将衰减为指向数组第一个元素的指针,并且完全等于&str1[0](即第一个元素).
现在我们知道第一个和第三个指针是指向数组中单个元素的指针(索引处的第一个指针0),很容易看到当我们用一元运算*符取消引用它时会发生什么:我们得到元素的值指针指向.这是字母'H',它们具有价值72的ASCII编码.
解释结果*(&str1)实际上相当简单,因为我们可以删除括号并得到*&str1.然后很容易看出运算符的取消引用和地址将相互抵消,留给我们str1.并且str1,如上所述,等于&str1[0],即指向阵列中第一个元素的指针.
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |