C ++ - имя массива и начальный адрес - PullRequest
1 голос
/ 20 января 2011

В C ++ без страха: руководство для начинающих, которое заставляет вас чувствовать себя умным в главе (7), упоминается следующее:

char str[10] = "Hello!";

Это объявление создает указанный массив и связывает начальный адрес . со стр . (Помните, что имя массива всегда переводится в его начальный адрес.) * * 1 010

Что подразумевается под этим? Я имею в виду, связь начального адреса с str?

Спасибо.

Ответы [ 5 ]

4 голосов
/ 20 января 2011

Это означает, что 'str' может рассматриваться как начальный адрес, где хранится строка "Hello".

Следовательно, str + 1 - это адрес, где хранится второй символ строки.

  |   str   | str+1  | str+2  | str+3 | str+4 | str+5  |
  |  str[0] | str[1] | str[2] | str[3]| str[4]| str[5] |
  |    H    |  e     |   l    |   l   |   o   |  \0    |
3 голосов
/ 20 января 2011

Что подразумевается под этим?

Это объявление создает отображаемый массив и связывает начальный адрес со строкой.

Это означает, что

  1. массив создается в памяти и заполняется содержимым "Hello!" (то есть символов 'H', 'e', 'l', 'l', 'o', '!', '\0')
  2. создается переменная-указатель str, указывающая на начальный адрес созданного ранее массива.

Однако это неверно .Описание в книге неверно или, по крайней мере, серьезно вводит в заблуждение.

str - это не указатель, это массив .Следовательно, он не «связан с начальным адресом».Он связан со всем массивом.

К сожалению, проблема становится еще более запутанной, поскольку C ++ и C позволяют неявно преобразовывать массивы в указатели.То есть допустимо следующее:

char* x = str;

Это называется «затуханием указателя», и это все время происходит в C ++.Достаточно навести взгляд на массив, чтобы преобразовать его в указатель.

Этот распад указателя эквивалентен следующему:

char* y = &str[0];

То есть, когда массив распадается на указатель,этот указатель указывает на первый элемент массива.Вероятно, это подразумевается как «связывает начальный адрес с str», но, как я объяснил выше, это не совсем правильно.(Кроме того, начальный адрес массива обычно перед адресом его первого элемента, поскольку массив также должен хранить свой размер, и этот размер обычно помещается в память непосредственно перед первым элементом массива.; но на это поведение нельзя положиться, это деталь реализации.)

2 голосов
/ 20 января 2011

Прежде всего, утверждение " имя массива всегда переводится в его начальный адрес. ", не является правильным на 100%.
Имя массива переводится в его начальный адрес, т.е.его первого элемента, за исключением двух случаев

  1. Когда он используется как операнд оператора sizeof.
  2. Когда он используется как операнд оператора address of i.e. &

Например:

char str[10]="Happy";
std::cout<<sizeof(str); // prints 10 as size of whole array is 10 bytes
std::cout<<&str; // address of array of 10 char, not address of address of char  

Во всех других случаях имя массива преобразуется в указатель на первый элемент.Так например:

char str[10]="Happy";
std::cout<<str; // same as &str[0]. Let it prints 0x1000
std::cout<<str+1; // same as &str[0]+1, will print 0x1001
std::cout<<&str; // Let it prints 0x1000
std::cout<<&str+1 // will print 0x100A
2 голосов
/ 20 января 2011

str можно рассматривать как указатель на адрес первого элемента массива, то есть & str [0].

0 голосов
/ 20 января 2011

Это означает, что str, взятый отдельно, имеет значение , может быть преобразовано в тип char* (указатель на символ), поэтому фактически содержит начальный адрес памяти массива символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...