C++的名称和数组的起始地址 < C++ >无恐惧:初学者指南,在第7章中让你感觉聪明,它提到以下内容: char str[10] = "Hello!"; char* y = &str[0];
此声明创建所示的数组,并关联起始地址 使用str。请记住,数组的名称总是转换为它的开头 地址 这是什么意思?我的意思是,起始地址与str的关联C++的名称和数组的起始地址 < C++ >无恐惧:初学者指南,在第7章中让你感觉聪明,它提到以下内容: char str[10] = "Hello!"; char* y = &str[0];,c++,string,char,C++,String,Char,此声明创建所示的数组,并关联起始地址 使用str。请记住,数组的名称总是转换为它的开头 地址 这是什么意思?我的意思是,起始地址与str的关联 谢谢。str可以被视为指向数组第一个元素地址的指针,即指向&str[0]。str可以被视为指向数组第一个元素地址的指针,即指向&str[0]。这意味着可以将“str”视为存储Hello字符串的起始地址 | str | str+1 | str+2 | str+3 | str+4 | str+5 | | str[0] | str[1]
谢谢。str可以被视为指向数组第一个元素地址的指针,即指向&str[0]。str可以被视为指向数组第一个元素地址的指针,即指向&str[0]。这意味着可以将“str”视为存储Hello字符串的起始地址
| 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 |
因此,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 |
这意味着“str”可以被视为存储Hello字符串的起始地址
| 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 |
因此,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 |
这意味着单独使用str可以转换为char*指向字符的指针类型,因此它实际上包含字符数组的内存起始地址。这意味着单独使用str可以转换为char*指向字符的指针类型,因此它实际上包含字符数组的内存起始地址。首先,数组名称始终转换为其起始地址的语句不是100%正确的。 数组的名称转换为其起始地址,即除两种情况外的第一个元素的地址 当它用作sizeof运算符的操作数时。 当它用作地址的操作数时,即&运算符。 例如:
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
在所有其他情况下,数组名转换为指向第一个元素的指针。例如:
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
首先,数组名称始终转换为其起始地址的语句不是100%正确的。 数组的名称转换为其起始地址,即除两种情况外的第一个元素的地址 当它用作sizeof运算符的操作数时。 当它用作地址的操作数时,即&运算符。 例如:
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
在所有其他情况下,数组名转换为指向第一个元素的指针。例如:
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
这是什么意思
此声明创建所示的数组,并将起始地址与str关联
这意味着
在内存中构造一个数组,并填充Hello!也就是说,字符‘H’、‘e’、‘l’、‘l’、‘o’、‘!’、‘S’等\0'
将创建一个指针变量str,并指向之前创建的数组的起始地址。
然而,这是错误的。书中的描述是错误的,或者至少是严重误导
str不是指针,而是数组。因此,它不“与起始地址关联”。它与整个阵列相关联
不幸的是,这个问题变得更加混乱,因为C++和C允许数组隐式地转换为指针。也就是说,以下各项是有效的:
char* x = str;
这叫做“指针衰变”,它总是在C++中发生。直接盯着数组将其转换为指针就足够了
此指针衰减相当于以下情况:char str[10] = "Hello!";
char* y = &str[0];
也就是说,当数组衰减为指针时,该指针指向数组的第一个元素。这可能意味着“将起始地址与str关联”,但正如我在上面解释的那样,这并不正确。此外,数组的起始地址通常在其第一个元素的地址之前,因为数组也需要存储其大小,并且该大小通常在数组的第一个元素之前放入内存;但是这种行为不能依赖,它是一个实现细节
这是什么意思
此声明创建所示的数组,并将起始地址与str关联
这意味着
在内存中构造一个数组,并填充Hello!也就是说,字符‘H’、‘e’、‘l’、‘l’、‘o’、‘!’、‘S’等\0'
将创建一个指针变量str,并指向之前创建的数组的起始地址。
然而,这是错误的。书中的描述是错误的,或者至少是严重误导
str不是指针,而是数组。因此,它不“与起始地址关联”。它与整个阵列相关联
不幸的是,这个问题变得更加混乱,因为C++和C允许数组隐式地转换为指针。也就是说,以下各项是有效的:
char* x = str;
这叫做“指针衰变”,它总是在C++中发生。直接盯着数组将其转换为指针就足够了
此指针衰减相当于以下情况:char str[10] = "Hello!";
char* y = &str[0];
也就是说,当数组衰减为指针时,该指针指向数组的第一个元素。这可能是卑鄙的
t通过“将起始地址与str关联”,但正如我在上面解释的,这并不是真正正确的。此外,数组的起始地址通常在其第一个元素的地址之前,因为数组也需要存储其大小,并且该大小通常在数组的第一个元素之前放入内存;但是这种行为是不可靠的,这是一个实现细节。No,str的类型为char[10],但在许多上下文中它可以隐式转换为char*。No,str的类型为char[10],但是它可以在很多上下文中隐式转换为char*@空格:我假设的C+=2编译器会!它只是推断,很明显,您正在编写一个“hello world”程序……如果hello语句实际上构建了一个包含hello world的数组,我会感到惊讶@空格:我假设的C+=2编译器会!这只是推断,很明显你在写一个“hello world”程序……这基本上意味着书的作者不知道他/她在说什么。啊!数组不是指针,作者什么时候才能知道这一点!这基本上意味着作者不知道他/她在说什么。啊!数组不是指针,作者什么时候才能知道这一点!还有一些情况下数组不会退化为指针,例如,当通过引用传递到函数中时:void foo char&a[10]会欣然接受问题中的数组是什么:数组。还有一些情况下数组不会退化为指针,例如,当通过引用传递给函数时:void foo char&a[10]会欣然接受问题中的数组,因为它是:数组。