Как можно char * name = "Дункан";быть действительным, если указатели могут содержать только адреса? - PullRequest
0 голосов
/ 19 декабря 2011

Я думал, что указатели могут содержать адреса только для других переменных. Так как же следующее утверждение, с которым я столкнулся, может быть верным? Он держит строку.

char * name = "Duncan"

Спасибо.

Ответы [ 6 ]

4 голосов
/ 19 декабря 2011

Содержит указатель на строку.Это не то же самое.name просто содержит адрес памяти, который содержит строку.

3 голосов
/ 19 декабря 2011

«Дункан» - это строка с нулевым символом в конце и как таковой массив char ({'D', 'u', 'n', 'c', 'a', 'n', '\0'}). char*name="Duncan"; устанавливает имя в адрес массива.

С вашим утверждением все в порядке в C, но в C ++ "Duncan" является массивом const char, поэтому вы должны использовать const char *name = "Duncan".

Кстати, если вам не нужно менять имя переменной указателя, лучше иметь const char name[] = "Duncan". Это только выделяет память для строки. Ваш пример кода выделяет память для строки и для имени переменной указателя. (Конечно, компилятор может оптимизировать отсутствующее имя.)

1 голос
/ 19 декабря 2011

указатели могут содержать адреса только для других переменных.

Это неверно: ссылки содержат адреса других переменных; указатели могут содержать адреса чего угодно или даже ничего конкретного (например, NULL).

В этом случае name содержит адрес блока памяти из 7 байтов, содержащего коды ASCII для D, u, n, c, a, n и \0.

1 голос
/ 19 декабря 2011

Это все еще указывает на строку.Сначала строка помещается в память, и name указывает на это.Он скомпилирован в вашу программу, поэтому может не быть очевидным.

0 голосов
/ 19 декабря 2011

Это определение указателя на символ.После определения справа от "=" у вас есть постоянное определение.Константа хранится где-то в памяти, а ее адрес используется в качестве первого значения для «имени».Позже вы сможете назначить другое значение «имя».Вы не привязаны к первому значению, фактически «имя» является переменной.

0 голосов
/ 19 декабря 2011

В этом конкретном случае компилятор будет хранить массив с данными Duncan\0 где-нибудь в объектном файле, и указатель будет указывать на него.

Так что да, указатель содержит только адрес. Данные где-то еще.

Это заставляет меня сказать, что писать такой код не очень хорошо. Например, если вы измените эту строку через указатель, вы получите неопределенное поведение.

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