【问题标题】:Assigning char array to pointer将char数组分配给指针
【发布时间】:2018-10-06 05:37:35
【问题描述】:

我正在尝试理解 C++ 中的 指针,但我目前对以下内容感到困惑:

char input_line[] = "hi?";
char* p;
p = &input_line;

while (*p)
{       
    cout << *p << endl;
    *p++;
}

我一定会在这里感到困惑,因为我认为这表示将 1d 数组的地址分配给 指针;但是,当我尝试编译它时,出现错误:error: cannot convert char (*)[4]' to 'char*' in assignment p = &amp;input_line;

看来我应该这样做:

const char input[] = "test?";
int quest_count = 0;
const char *i = input;

while(*i){
    cout << *i << endl;
    *i++;
}   

这对我来说没有意义,因为您将 char array 分配给存储地址的 char pointer

【问题讨论】:

  • This doesn't make sense to me because you are assigning a char array to a char pointer 这是有道理的,因为数组衰减为指针。
  • p = &amp;input_line; 尝试将“指向char 数组的指针”分配给“指向char 的指针”。这些类型是不兼容的。你的意思是写p = input_line;
  • 在大多数情况下,数组名被转换为指针。
  • p = input_line 可以工作
  • 在 C++ 中既不使用指针也不使用数组。没有理由这样做,因为现在有更好的选择。

标签: c++ arrays pointers char


【解决方案1】:

这行代码的错误:

p = &input_line;

可以通过改变它来解决:

p = input_line;

那是因为您正在分配 数组 的内存方向。 它的值是一个指向 char 指针的指针。这就是为什么错误是 提高。请记住,运算符&amp; 为您提供变量内存 方向。

指针存储对象的内存方向。 数组是按某种类型排列的对象序列,它们位于内存中连续保留的空间量中。

数组的每个索引都是一个由0到9的数字组成的数字。数组的每个元素都是一个可以获取地址的对象,例如指针 到对象内存位置。在 array 中,对象位于连续的内存位置。当您将 array 分配给 pointer 时,您将指针分配给 arrays 第一个元素,即array[0]

当您将 pointer 值增加 1 时,pointer 将指向内存位置中的下一个对象。因此,数组和指针 具有类似的行为。如果您为 pointer 分配一个 array,然后将指针值增加 1,它现在将指向数组中的对象。

这不仅适用于 char 类型,它适用于 C++ 中的每种类型。 In this page 你可以获得更多关于指针和数组的信息。 必须注意,指针和数组必须包含或指向相同的变量类型。

这是来自this page 的示例:

int* ptr;
int a[5];
ptr = &a[2];  // &a[2] is the address of third element of a[5].

this page 中示例的输出示例是:

使用数组显示地址:

&arr[0] = 0x7fff5fbff880
&arr[1] = 0x7fff5fbff884
&arr[2] = 0x7fff5fbff888
&arr[3] = 0x7fff5fbff88c
&arr[4] = 0x7fff5fbff890

使用指针显示地址:

 ptr + 0 = 0x7fff5fbff880
 ptr + 1 = 0x7fff5fbff884
 ptr + 2 = 0x7fff5fbff888
 ptr + 3 = 0x7fff5fbff88c
 ptr + 4 = 0x7fff5fbff890

正如您在输出示例中所注意到的,两者都指向同一个内存位置,因此您可以从这两种方法访问对象。

正式地,在C++ 11 standard 中提到:

数组到指针的转换:


类型为“array of N T”或“array of T 的未知边界可以转换为“指针”类型的纯右值 到T”。结果是指向array 的第一个元素的指针。

您可以查看这些页面以获取有关此主题的更多信息:

C++ Pointer to an Array.

C++ Pointers and Arrays.

C++ Pointer to an Array.

C++11 Standard Library Extensions

【讨论】:

  • 有点吹毛求疵:数组不是“集合”这个词的数学意义上的集合,我之所以提出它只是因为集合论对计算机科学非常重要。一个集合没有任何特定的顺序(即std::set 比一个集合多一点)并且它没有重复。数组通常用于存储碰巧是集合的内容,但同样经常重复或序列很重要,例如在一个字符串中。我猜是用“sequence”而不是“set”这个词吧?
  • 好的!谢谢你!
【解决方案2】:

来自C++11 standard(强调我的):

N T 的数组”或“T 的未知边界数组”类型的左值或右值可以转换为“指向T 的指针”类型的右值。 结果是指向数组第一个元素的指针

这种转换,将数组转换为指向数组第一个元素的指针,通常称为“数组衰减为指向数组第一个元素的指针”。

这种转换适用于所有类型,而不仅仅是char

int array_1[10] = {};
int* ptr1 = array_1;     // ptr1 is a pointer to the first element of array_1

double array_2[10] = {};
double* ptr2 = array_2;  // ptr2 is a pointer to the first element of array_2

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 1970-01-01
    • 2015-10-26
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2020-06-01
    • 1970-01-01
    相关资源
    最近更新 更多