Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++的名称和数组的起始地址 < C++ >无恐惧:初学者指南,在第7章中让你感觉聪明,它提到以下内容: char str[10] = "Hello!"; char* y = &str[0];_C++_String_Char - Fatal编程技术网

C++的名称和数组的起始地址 < C++ >无恐惧:初学者指南,在第7章中让你感觉聪明,它提到以下内容: char str[10] = "Hello!"; char* y = &str[0];

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的关联


谢谢。

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]会欣然接受问题中的数组,因为它是:数组。