首先,您的问题的实质:编译器严格按照声明大小处理 sizeof 。在下面的代码中,假设一个指针变量拥有一个 32 位(4 字节)的地址:
char str1[] = "abcd";
char *pstr = str1;
// str1 is declared to be a fixed array of 5 chars (4+nul)
size_t str1size = sizeof(str1); // str1size = 5;
// pstr is declared to be a 32 bit pointer to a memory address.
size_t pstrSize = sizeof(pstr) // size of a 32 bit pointer; 4.
要掌握您所看到的结果,请查看数组和指针变量的差异(其中比大多数人想象的要少)。
数组和指针变量在 C 中的核心区别是
- 一个指针变量保存一个地址;声明的数组是一个地址。
- 因此,声明的数组不能修改它们的“地址” (因为它们是地址,它们不像指针变量那样保存地址)。
如果你真的想用 C 语言围绕数组和指针,我根本无法强调其中的第一个。除此之外,它们的关系充其量是乱伦的。指针变量位于数组(或任何其他变量)之类的地址。但与数组不同的是,它们还保存一个地址作为它们的值。数组就是它们的地址。
第一个最好用以下方式证明:
char str1[] = "abcd";
char *pstr = NULL;
pstr = str1; // ok. pstr holds the address *at* str1.
str1[0] = *pstr; // ok. copies 'a' on to 'a'.
pstr++; // ok. increment the address held in pstr by one item (char) size.
str1[0] = *pstr; // ok. copies 'b' over 'a'.
pstr = str1+1; // ok. pstr holds the address *at* str1 + one item (char) size.
str1 = pstr; // does not compile. str1's address cannot be changed.
请注意,指针变量本身包含一个地址,而固定数组是一个地址。因此,最后一个语句颠倒是完全没问题的。
pstr = str1; // ok. put the str1 address in pstr, a pointer variable.