我是C++新手,遇到了这个问题,这是我的代码:
shared_ptr<char[]>var(new char[20]);
char *varptr = *(var.get());
所以我正在创建字符数组的智能指针。
我遇到的问题是,在编译过程中,它给我错误说:
cannot convert argument 1 from 'char *' to 'char(*)[]'
正如shared_ptr::get
声明所说T* get() const noexcept;
它返回模板的指针,在我的例子中是指向char[]
的指针。取消引用它应该给我char[]
,并将其分配给char*
应该没问题。
似乎我错过了什么,无法弄清楚是什么。
char*
和char(*)[]
有什么区别?char(*)[]
不就是字符数组的指针吗?分配给char*
不应该没问题吗?
char(*)[]
是一个指向char
数组(大小未知)的指针,它可以指向一个数组。
char*
是指向char
的指针,它可以指向数组的元素。
从语义上讲,这两种类型是非常不同的东西。
要从char(*)[]
获取char *
,您需要获取指向数组特定元素(通常是第一个元素)的指针:
char* varptr = &(*var.get())[0];
如果您只需要一个字符串,请改用std::string
。
为了解释指针到元素和指针到数组之间的区别,请考虑以下数组:
char a[3];
指向第一个元素(a[0]
)的指针可以表示为&a[0]
,这就是普通a
衰变。指向整个数组的指针&a
。
如果我们向它展示它在内存中的布局方式,并添加一些"指针",它是这样的:
+------+------+------+----- |A[0] |A[1] |A[2] |... +------+------+------+----- ^ ^ ^ ^ | | | | A A+1 A+2 | | | &a (&a)+1
即使通过指针a
(等于&a[0]
)和指向同一位置的指针&a
,它们也是两个不同的指针,对它们进行指针算术也会做不同的事情。