我是c ++的初学者,使用字符数组时我不了解一件事:因此,我知道指针本质上是“指向”另一个变量的内存地址的变量,并且该变量的名称一个数组(例如:int a [20])是指向该数组中值的常量指针。当使用不同的数值类型(int,float等)时,如果我们通过一条消息输出该数组的名称,则该数组将显示第一个元素的地址,但是如果我们对一个char类型进行相同的操作,则不会显示地址,但变量的值。 示例:
#include <iostream>
using namespace std;
int main()
{int a[]={1,2,3,4,5};
cout<<a<<endl; //through output, it shows the memory address of the first
element of the array;
char b[]={"Mountain"};
cout<<b; //It outputs the word "Mountain"
return 0;
}
输出时,char数组中的指针是否自动转换为其值?
答案 0 :(得分:4)
没有区别。 char
指针与int
指针在魔术上没有什么不同。那到底是怎么回事?
std::cout <<
(或较旧的printf()
)具有char*
的重载。这意味着如果输入为char*
,则函数的行为会有所不同:迭代指针,直到到达'\0'
字符为止(请参见null terminated string)。
char b[]={"Mountain"};
b
不包含
{'M', 'o', 'u', 'n', 't', 'a', 'i', 'n'}
但是
{'M', 'o', 'u', 'n', 't', 'a', 'i', 'n', '\0'}
<-'\0'
使迭代和停止成为可能。
这也解释了为什么b
的数组大小比单词中的字符数大1
。
要添加,您应该不使用这些字符指针。它们很危险,长期以来被std::string
之类的现代公用事业所取代。
现在int a[]={1,2,3,4,5};
可以,但是std::array<int, 5> a = {1,2,3,4,5};
更好。
std::array<int, 4> != std::array<int, 5>
).size()
功能。 std::array
可以通过包含<array>
来使用。
如果您想去int* a = new int[5];
之类的东西而不是就停在那儿,而是使用std::vector
永远不会说use namespace std;
(here why)
答案 1 :(得分:1)
这完全取决于您如何解释参数。 cout <<运算符会将(sometype *)视为地址,但特别将char *视为字符串。
如果编写带有自己参数的函数,则可以按照自己喜欢的方式进行解释。
在此问题中,如果您想获取地址,可以这样做
std::cout << static_cast<const void*>(b);
答案 2 :(得分:0)
在C中,字符串表示为指向char
的指针。因此,当您在C ++中将char*
传递给ostream
(例如std::cout
)时,它将解释为以空值结尾的字符串,并打印该字符串的内容而不是地址。如果要打印地址,则必须将该指针转换为其他类型:
std::cout << (void*)b;
答案 3 :(得分:0)
IConfiguration
是输出流。当我们使用输出流并传递cout
时,会将其视为以null结尾的字符串(即,打印所有字符,直到找到'\ 0')。对于其他任何指针类型,都将打印地址。