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

时间:2019-06-09 11:10:33

标签: c++ pointers smart-pointers

我是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*可以吗?

1 个答案:

答案 0 :(得分:2)

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指向同一位置,它们也是两个不同的指针,对它们执行指针算术将做不同的事情