char数组及其指针如何在c ++中正常工作?

时间:2019-04-16 12:07:47

标签: c++

我是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数组中的指针是否自动转换为其值?

4 个答案:

答案 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

enter image description here


要添加,您应该使用这些字符指针。它们很危险,长期以来被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()功能。
  • 因此,您可以将其传递给其他函数,而无需添加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')。对于其他任何指针类型,都将打印地址。