将char数组分配给指针

时间:2018-04-25 16:46:08

标签: c++ arrays pointers char

我正在尝试理解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 = &input_line;

看起来我应该这样做:

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

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

这对我没有意义,因为您要将char 数组分配给存储地址的char 指针

2 个答案:

答案 0 :(得分:4)

  

这行代码中的错误:

p = &input_line;
     

可以通过以下方式解决:

p = input_line;
     

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

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

数组的每个索引都是一个由0到9的数字组成的数字。数组的每个元素都是一个可以取地址的对象,就像指针< / strong>到对象内存位置。在数组中,对象位于连续的内存位置。当您将数组分配给指针时,您需要将指针指定给数组第一个元素,它是&#39; s { {1}}。

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

This image is taken from the page below mentioned.

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

  

以下是this page的示例:

char

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

  

使用数组显示地址:

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

使用指针显示地址:

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

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

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

  

数组到指针的转换:

     

ptr + 0 = 0x7fff5fbff880 ptr + 1 = 0x7fff5fbff884 ptr + 2 = 0x7fff5fbff888 ptr + 3 = 0x7fff5fbff88c ptr + 4 = 0x7fff5fbff890 array”或“N的”T类型的左值或右值   array“的未知边界可以转换为类型”指针的prvalue   到T“。结果是指向T的第一个元素的指针。

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

C++ Pointer to an Array.

C++ Pointers and Arrays.

C++ Pointer to an Array.

C++11 Standard Library Extensions

答案 1 :(得分:2)

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

  

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

这种转换,将数组转换为指向数组第一个元素的指针,通常称为&#34;数组衰减到指向数组第一个元素的指针&#34;。

此转换适用于所有类型,而不仅仅是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