C путаница с указателями и массивами - PullRequest
0 голосов
/ 29 марта 2010
char a[]="HELLO";
char *p="HELLO";

будет a[2] и p[2] получать один и тот же символ?

Ответы [ 5 ]

3 голосов
/ 29 марта 2010

То, что они будут извлекать, это кусок памяти размером с символ, расположенный на 2 шага размером с символ (размером 2 байта) после начала каждого или после адреса в памяти, на который указывает каждая переменная. В данном случае это 'L', но это не тот же адрес в памяти.

Так что да, в приведенном примере они будут получать один и тот же символ.

2 голосов
/ 29 марта 2010

В обоих случаях они получат 'L'. Тем не менее, это не то же самое 'L'. Они хранятся в разных местах. Это означает, что если вы сравните их указатели, они не будут равны.

2 голосов
/ 29 марта 2010

Да.

p [2] эквивалентно * (p + 2)

HELLO
  ^
*(p+2)

Следует отметить, что первый «HELLO», вероятно, будет храниться на странице памяти с возможностью записи, в то время как второй «HELLO», вероятно, будет храниться на странице только для чтения. Это очень тесно связано с компилятором / платформой, на которой вы находитесь.

0 голосов
/ 29 марта 2010

Полагаю, это зависит от того, какой компилятор вы используете, но ответ, вероятно, нет.

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

Во всяком случае, вы не должны полагаться на это;)

0 голосов
/ 29 марта 2010

Оба будут иметь одинаковое значение символа.

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