在第(7)章的 C ++ Without Fear:让你感觉聪明的初学者指南中,它提到了以下内容:
char str[10] = "Hello!";
此声明创建显示的数组,并关联 起始地址 使用str 。 (请记住,数组的名称总是转换为它的开头 地址)。
这是什么意思?我的意思是,起始地址与str的关联?
感谢。
答案 0 :(得分:4)
这意味着'str'可以被视为存储“Hello”字符串的起始地址。
因此str + 1是存储字符串第二个字符的地址。
| str | str+1 | str+2 | str+3 | str+4 | str+5 |
| str[0] | str[1] | str[2] | str[3]| str[4]| str[5] |
| H | e | l | l | o | \0 |
答案 1 :(得分:3)
这是什么意思?
此声明创建显示的数组,并将起始地址与str。
相关联
这意味着
"Hello!"
的内容(即字符'H'
,'e'
,'l'
,'l'
, 'o'
,'!'
,'\0'
)str
并指向之前创建的数组的起始地址。然而,这是错误的。书中的描述是错误的,或至少是严重误导。
str
不是指针,它是数组。因此,它不是“与起始地址相关联”。它与整个数组相关联。
不幸的是,这个问题变得更加混乱,因为C ++和C允许将数组隐式转换为指针。也就是说,以下内容有效:
char* x = str;
这称为“指针衰减”,它一直在C ++中发生。只需尖锐地盯着一个数组就可以将它转换为指针。
此指针衰减等效于以下内容:
char* y = &str[0];
也就是说,当数组衰减到指针时,该指针指向数组的第一个元素。这可能意味着“将起始地址与str相关联”,但正如我上面所解释的那样,这并不是真的正确。 (此外,数组的起始地址通常是之前地址到其第一个元素,因为数组也需要存储它的大小,并且该大小通常在紧接第一个元素之前放入内存中。 array;但是这个行为是不可靠的,它是一个实现细节。)
答案 2 :(得分:2)
str可以被视为指向数组第一个元素地址的指针,即& str [0]。
答案 3 :(得分:2)
首先,声明“数组的名称始终转换为其起始地址。”,并非100%正确。
数组的名称转换为它的起始地址,即第一个元素的地址,除了两种情况
sizeof
运算符的操作数时。address of i.e. &
运算符的操作数时。 例如:
char str[10]="Happy";
std::cout<<sizeof(str); // prints 10 as size of whole array is 10 bytes
std::cout<<&str; // address of array of 10 char, not address of address of char
在所有其他情况下,数组名称转换为指向第一个元素的指针。所以对于前者:
char str[10]="Happy";
std::cout<<str; // same as &str[0]. Let it prints 0x1000
std::cout<<str+1; // same as &str[0]+1, will print 0x1001
std::cout<<&str; // Let it prints 0x1000
std::cout<<&str+1 // will print 0x100A
答案 4 :(得分:0)
这意味着str
,单独使用,是可以转换为类型char*
(指向字符的指针),所以它实际上包含了内存起始地址字符数组。