C++:char* 与 char(*)[]

C++: char* vs char(*)[]

我是 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; 它 returns 模板的指针,在我的例子中是指向 char[] 的指针。取消引用它应该给我 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.

如果我们展示它在内存中的布局,加上一些 "pointers",它是这样的:

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

即使指针a(等于&a[0])和&a指向同一个位置,它们也是两个不同的指针,对它们进行指针运算就可以了不同的东西。