Присвоение массива char указателю - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь понять указатели в 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 голосов
/ 26 апреля 2018

Ошибка в этой строке кода:

p = &input_line;

Можно решить, изменив его на:

p = input_line;

Это потому, что вы назначаете направление памяти для массива . Его значение является указателем на указатель на символ. Вот почему ошибка поднял. Помните, что оператор & предоставляет вам память переменных направление.

A указатель сохраняет направление памяти объекта. Массив представляет собой последовательность объектов определенного типа, расположенных в зарезервированном зарезервированном объеме пространства в памяти.

Каждый индекс массива - это число, состоящее из цифр от 0 до 9. Каждый элемент массива - это объект, адрес которого можно получить, например, указатель * 1023. * в ячейку памяти объекта. В массиве объекты расположены в последовательных ячейках памяти. Когда вы присваиваете массив указателю , вы назначаете указатель на первый элемент arrays , это array[0].

Когда вы увеличиваете на 1 значение указателя , указатель будет указывать на следующий объект в ячейке памяти. Итак, массивы и указатели ведут себя аналогично. Если вы назначите указатель массив , а затем увеличите на 1 значение указателя, он теперь будет указывать на объект в массиве.

This image is taken from the page below mentioned.

Это не только для char типа, это для каждого типа в C ++. На этой странице вы можете получить больше информации об указателях и массиве. Вы должны заметить, что указатель и массив должны содержать или указывать на один и тот же тип переменной.

Вот пример из этой страницы :

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

Отображение адреса с помощью указателей:

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

Как вы можете заметить в выходном примере, оба указателя указывают на одно и то же место в памяти, поэтому вы можете получить доступ к объектам обоими методами.

Формально в стандарте C ++ 11 упоминается, что:

Преобразование массива в указатель:

lvalue или rvalue типа «array из N T» или «array из неизвестная граница T »может быть преобразована в значение типа« указатель » до T ». Результатом является указатель на первый элемент array.

Вы можете увидеть эти страницы для получения дополнительной информации об этой теме:

C ++ Указатель на массив.

C ++ Указатели и массивы.

C ++ Указатель на массив.

C ++ 11 Стандартные библиотечные расширения

0 голосов
/ 25 апреля 2018

Из C ++ 11 стандарта (выделено мной):

lvalue или rvalue типа «массив из 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
...