【问题标题】:C++: char* vs char(*)[]C++:char* 与 char(*)[]
【发布时间】:2019-06-09 11:10:33
【问题描述】:

我是 C++ 新手,遇到了这个问题,这是我的代码:

shared_ptr<char[]>var(new char[20]);

char *varptr = *(var.get());

所以我正在创建 char 数组的智能指针。

我遇到的问题是在编译过程中它给了我错误提示:

cannot convert argument 1 from 'char *' to 'char(*)[]'

正如shared_ptr::get 的声明所说T* get() const noexcept; 它返回模板的指针,在我的例子中是指向char[] 的指针。取消引用它应该给我char[] 并将它分配给char* 应该没问题。

我好像遗漏了什么,不知道是什么。

char*char(*)[] 有什么区别? char(*)[] 不只是 char 数组的指针吗?不应该把它分配给char* 可以吗?

【问题讨论】:

    标签: c++ pointers smart-pointers


    【解决方案1】:

    char(*)[]是一个指向char的数组(大小未知)的指针,它可以指向一个数组。

    char*是一个指向char的指针,它可以指向一个数组的元素。

    这两种类型在语义上是非常不同的东西。

    要从char(*)[] 中获取char *,您需要获取指向数组特定元素(通常是第一个元素)的指针:

    char* varptr = &(*var.get())[0];
    

    如果你想要的只是一个字符串,那么请改用std::string


    要解释指向元素的指针和指向数组的指针之间的区别,请考虑以下数组:

    char a[3];
    

    指向第一个元素 (a[0]) 的指针可以表示为 &amp;a[0],这是普通的 a 衰减到的内容。指向整个数组的指针是&amp;a

    如果我们展示它在内存中的布局,并添加一些“指针”,它是这样的:

    +------+------+------+------ |一个[0] |一个[1] |一个[2] | ... +------+------+------+------ ^ ^ ^ ^ | | | | aa+1a+2 | | | &a (&a)+1

    即使通过指针a(等于&amp;a[0])和&amp;a指向同一个位置,它们是两个不同的指针,对它们进行指针运算会做不同的事情。

    【讨论】:

    • 谢谢。请再问一个问题,char 数组的指针和指向 char 的指针不是一回事吗?他们都拥有相同类型的地址?为什么将一个分配给另一个有问题?对不起,如果问题听起来很愚蠢。
    • 如果我错了,请纠正我,唯一的原因是无法将 char 数组的指针分配给 char 指针,因为它们的算术运算不同?
    • @Ojs 不,类型是不同的。指针算术不同是因为类型不同。
    • 还有一个请 :) char(*)[] 是“类型”&amp;a 对吧?
    • @Ojs &amp;a 的类型(在我的示例中)实际上是 char(*)[3]。在您的问题中,类型是char(*)[](大小不确定),因为智能指针不知道大小。
    猜你喜欢
    • 1970-01-01
    • 2011-07-08
    • 2020-01-09
    • 2011-06-17
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多