2016-07-31 9 views
0
int main() 
    { 
     char *name="Shakib Al Hasan"; 
     printf("My name is %s\r\n",name) ; 

     return 0; 
    } 

Эти коды работают хорошо. Как мы все знаем, указатель должен указывать на другую переменную того же типа данных перед использованием. Но в этом случае нет другой переменной, объявленной и назначенной. Мой вопрос: как это работает?Как работает указатель, когда он присваивает напрямую строку без указания какой-либо переменной?

+2

'char * name' - указательная переменная, которая была инициализирована адресом строкового литерала. Затем он передается 'printf'. –

+0

Не используйте '' \ r \ n "'.Если ваша платформа использует эти байты в качестве разрыва строки, печать '' \ n "' должна выводить оба. – aschepler

+0

Постоянная строка находится на постоянном адресе в исполняемом изображении. Переменная 'name' устанавливается так, чтобы указывать на значение этого адреса. –

ответ

2

Строковый литерал действует так, как если бы у вас был массив символов static const. Фактический массив создается компилятором. Так что ваш код почти эквивалентно

int main() 
{ 
    static const char name_literal[] = "Shakib Al Hasan"; 
    char *name= (char*) name_literal; 
    printf("My name is %s\r\n",name) ; 

    return 0; 
} 

(Одна небольшая разница: вы не получаете гарантию того, что name_literal находится по другому адресу от всех других объектов.)

+0

Грязные, грязные ... :-) - опасность впереди: http://stackoverflow.com/documentation/c/364/undefined-behavior/13573/modifying-a-const-variable-using-a-pointer#t= 201607311720402219155 – alk

1

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

Правильно ...

... но PLS обратите внимание, что указатель не означает, что указатель указывает на переменную.

На самом деле указатель указывает на ячейку памяти, содержащую данные того же типа (то есть того же типа, что и указатель).

Следовательно, здесь name, который является указатель, указывает на начальный адрес ячейки памяти только для чтения, который содержит строку "Shakib Al Hasan" (по существу char массив). И он печатается с использованием спецификатора формата %s и передает начальный адрес этого указателя под названием name.

0

Когда вы сохраняете указатель на строку, поместите строку в «случайные адреса памяти». Значение такое же, как при заказе книги из Амазонки. Я прошу их доставить в мой дом на веб-сайт Amazon Web Services. Я должен прийти ко мне домой, чтобы взять его прямо у рододателя. Итак, я оставляю свой домашний адрес на сервисах веб-сайта Amazon Это просто адрес памяти.

char * string = "hello"; Это пример. Это не дает прямое значение «привет» доставщику. Итак, я даю «string» - строковая переменная в «случайном адресе памяти» «hello».

  • Все переменные указаны в промежутке времени, когда программа выполнена, в случайной адресной памяти. Это не просто невидимо для программиста.
  • Все переменные, используемые указанным размером в байтах пространства памяти.

Фактически, я не совершенен, и я все еще участвую в процессе обучения. Моя информация также не на 100% идеальна. Если в моем ответе есть ошибка или неверный перевод, Дайте мне комментарии.

+0

Пояснение не так, а затем дайте мне комментарий! –

+0

«Я не совершенен, и я - процесс обучения». Если вы имеете в виду себя, то это должно быть я не совершенен, и я участвую в процессе обучения. –

+0

Моя английская грамматика не идеальна. Спасибо, что дали комментарий! :) –