C / CPP中的char []和char [n]有什么区别?

时间:2019-04-03 01:53:58

标签: c++

试图找出C / CPP中的字符串文字类型

printf("%s\n", typeid("abc").name());
printf("%s\n", typeid(const char[]).name());

打印

A4_c
A_c

不熟悉C,数组的长度/容量不同意味着C中的类型不同吗?如果是,为什么在传递函数参数时为什么将char [n]作为char []传递?

2 个答案:

答案 0 :(得分:5)

  

不同的数组长度/容量意味着C中的类型不同吗?

是的

  

如果是,为什么在传递函数参数时为什么将char [n]作为char []传递?

实际上不可能接受数组值作为函数参数。当将函数参数声明为数组类型时,该声明会通过语言调整来表示指向该数组类型元素的指针。即char数组变为指向char的指针。同样适用于返回类型。示例:

void function(char argument[N]); // this
void function(char *argument);   // actually means this

类似地,当将数组名用作值参数时,该数组名隐式转换为指向数组第一个元素的指针。这种隐式转换称为衰减。示例:

void function(char *argument);
char array[N];
function(array); // array decays to pointer to first element

请注意,此调整仅适用于“顶级”阵列。即使在函数参数声明中,指向数组的指针和指向数组的引用也不能调整为指向该数组的元素的指针或引用。


  

C / CPP中的char []和char [n]有什么区别?

char[n]是数组类型。它是n个元素的数组。这是一个完整的类型。可以创建这种类型的数组。

char[]是一个未知范围的数组。它是不完整的类型。无法创建此类型的数组。此类型只能在将其调整为其他类型的上下文中使用。在函数声明中,将其调整为指向元素的指针。

在非参数数组的声明中,将其调整为从初始化程序推导出的已知范围的实际数组类型:

char arr[] = {'1', '\0'}; // type of arr is adjusted to char[2]
char arr[];               // ill-formed declaration

答案 1 :(得分:2)

由于不同编译器的typeid()。name()输出有所不同,因此将输出管道传递到c ++ filt是查看类型名称的更好方法。

此代码:

#include <iostream>

int main(void)
{
    std::cout << typeid("abc").name() << std::endl;
    std::cout << typeid(const char[]).name() << std::endl;
    return (0);
}

编译并作为./a.out输出运行:

A4_c
A_c

但是以./a.out | c++filt的身份运行时 输出以下内容:

char [4]
char []

对于char [] vs char [4]来说,这是最小的,但是对于大型嵌套类型和auto在后​​来的C ++标准中,它成为查看幕后情况的便捷工具。

(抱歉,不是直接的答案,但是哦,我不愿意在任何情况下查看未格式化的typeid名称,尤其是因为它们是特定于编译器的)