C++:字符* vs 字符(*)[]



我是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,它们也是两个不同的指针,对它们进行指针算术也会做不同的事情。

最新更新