C - 为什么不管变量类型如何,'address of' 运算符都会返回一个变量的整数值?

ndr*_*u96 3 c arrays c-strings memory-address

我正在对不同类型的字符串进行一些练习并返回它们的地址,以便我可以更好地理解指针运算的概念。

我注意到当使用 printf 函数和 %p 作为参考字符时,在变量上使用 & 操作数时地址会增加 4 + 1 个字节,没有它时增加 1 个字节。

这是我的代码示例及其输出:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 
 5 int main ()
 6 {
 7 char charString_1[] = "Hello";
 8 printf("%s\t%s\t %p\t %p\n", charString_1 + 1, charString_1 + 1, &charString_1 + 1, charString_1 + 1);
Run Code Online (Sandbox Code Playgroud)

输出如下 ello ello 0x7ffe76aba5d0 0x7ffe76aba5cb

仅查看最后两个十六进制数字,地址分别为 203 和 208(十进制)。所以后者是一个比前者大的 char + int 值。如果我增加 2 (&charString_1 + 2) ,现在差距是 2(char + int) = 10 字节。

我知道这个问题可能很荒谬,但我的搜索结果却一无所获。我试图了解内存是如何工作的,并更好地在有缺陷的代码中查找常见错误。

Adr*_*ica 5

当您对指针进行算术运算时,“基本单位大小”是指向的对象的大小。

因此,对于char_string指向 a char(size = 1) 的 ,该+ 1操作添加一个

但是,表达式&char_string求值作为一个指针到一个数组,其(在您的示例)的尺寸为6个字符(包括nul终止子),所以+ 1上操作增加6。

您的两个%p字段 (5)打印的值的差异是这两个大小之间的差异 (6 - 1 = 5)。如果您更改数组的长度(例如,像char charString_1[] = "Hello, World!";),您将看到 的值发生相应的变化&charString_1 + 1

  • `&amp;char_string` 是指向数组的指针,而不是指向指针的指针。加 1 会根据数组的大小而不是指针的大小来调整地址。 (2认同)