【发布时间】:2021-11-02 22:54:34
【问题描述】:
试图围绕“C 编程语言”中的第 5.7 章到第 5.9 章,处理多维数组、指针数组等,我得出以下观察结果:
如果在下面的代码中 foo 被声明为一个指向 char 数组的指针,并且我稍后想为它分配一个 char 类型的指针,我必须在字符串文字前加上一个 & 符号。但是,如果我将bar 声明为指针,则在没有& 符号的情况下也可以进行相同的操作。
char (*foo)[3]; // creates a single pointer to a char array of size 3
char *bar; // creates a single pointer to char
int main()
{
foo = &"AB";
bar = "AB";
return 0;
}
反汇编(64 位 Macho-O)似乎(至少在初学者看来)对两个任务执行相同的操作:
Disassembly of section __TEXT,__text:
0000000100003f80 _main:
100003f80: 55 push rbp
100003f81: 48 89 e5 mov rbp, rsp
100003f84: 31 c0 xor eax, eax
100003f86: 48 8d 0d 7b 00 00 00 lea rcx, [rip + 123] // address of 'bar'
100003f8d: 48 8d 15 6c 00 00 00 lea rdx, [rip + 108] // address of 'foo'
100003f94: c7 45 fc 00 00 00 00 mov dword ptr [rbp - 4], 0
100003f9b: 48 8d 35 08 00 00 00 lea rsi, [rip + 8] // address pointing to 'AB'-String
100003fa2: 48 89 32 mov qword ptr [rdx], rsi // store address of 'AB' in 'foo'
100003fa5: 48 89 31 mov qword ptr [rcx], rsi // store address of 'AB' in 'bar'
100003fa8: 5d pop rbp
100003fa9: c3 ret
Disassembly of section __TEXT,__cstring:
0000000100003faa __cstring:
100003faa: 41 42 <unknown>
100003fac: 00 <unknown>
Disassembly of section __DATA,__common:
0000000100004000 _foo:
...
0000000100004008 _bar:
...
由于我正在阅读的这本书是我与 C 的第一次接触,我担心我在这里遗漏了一些明显的东西。如果我在这两种情况下都需要&-symbol,这不是更合乎逻辑吗?
【问题讨论】:
-
"string pointer" 听起来像使用 string 就好像它是一种类型 - 它不是。 “我稍后要为其分配一个字符串指针”,不如“我稍后要为其分配一个
char指针”更好。
标签: arrays c pointers string-literals