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
指向同一个位置,它们也是两个不同的指针,对它们进行指针运算就可以了不同的东西。
我是 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
指向同一个位置,它们也是两个不同的指针,对它们进行指针运算就可以了不同的东西。