names[i]
- указатель типа char*
. &names[i]
является указателем на names[i]
и, следовательно, имеет тип char**
. Картинка памяти:
names for each i, this is where names[i] *points*
|__________________ 0 1 2 3 4
| | | | | | |
| | v v v v v
[0 ][1 ][2 ][3 ][4 ] <gap> peter0lisa0simon0sarah0julie0
^
|_This is where &names[2] points, i.e. this is where names[2] *is*
name
- это массив из 5 указателей, и я изобразил каждый указатель в квадратных скобках и его индекс. Плюс пробел, потому что указатели на моей машине 4 байта. Это ситуация сразу после инициализации names
. Отдельный фрагмент памяти справа представляет собой последовательность байтов, где каждый 0
указывает байт 0 / NUL, а не символ 0
. Реализация (компилятор, компоновщик и загрузчик работают вместе) является обязанностью назначать память для строковых литералов - я предположил, что все строковые литералы, которые вы использовали, будут кластеризованы вместе, хотя это не обязательно так. Наконец, числа 0 ... 4 указывают, куда указывает каждый указатель в names
.
Поскольку вы присваиваете char*
, вам нужен char*
. Или, если посмотреть по-другому, указатели указывают на одно и то же, если (и только если) сами указатели имеют одинаковое значение. Так что, если вы хотите, чтобы search_names[i]
(который является указателем) указывал на то же самое, на что указывает names[i]
, то search_names[i] = names[i]
совершенно верно.
Хотя я не знаю, что намеревался сделать names[i]++
. Изменяет указатель names[i]
. Изменение указателя заставляет его указывать на другое. В этом случае вы получите names[0]
, указывающее на «eter», names[1]
, указывающее на «isa», и т. Д.
Вот как выглядит память после увеличения каждого указателя в names
:
names
|_____________ 0 1 2 3 4
| | | | | | |
v v v v v v v
[0][1][2][3][4] peter0lisa0simon0sarah0julie0
Кстати, вам разрешено назначать строковый литерал для char*
, но это не значит, что вы должны . Было бы лучше объявить ваши массивы const char *names[SIZE]
. Это неопределенное поведение для изменения памяти, выделенной компилятором для строкового литерала, и использование const char*
вместо char*
помогает обеспечить это.