смысл заявления - PullRequest
       36

смысл заявления

1 голос
/ 30 июня 2011

Я много раз сталкивался с утверждением char* ch = "hello";.

Я понимаю, что char* ch говорит о том, что ch является указателем на char. Но что означает присвоение hello для ch?

Я не могу понять это? пожалуйста помоги.

Ответы [ 4 ]

4 голосов
/ 30 июня 2011

Это означает, что ch - указатель на символ.Когда вы делаете char* ch = "hello" ch будет указывать на первый символ, то есть символ h.Чтобы указать на второй символ, вы можете сделать ch + 1 или ch[1].Обратите внимание, что в идеале тип ch должен был быть const char*, поскольку вы не можете записать в указанную область памяти.

3 голосов
/ 30 июня 2011

Строковые литералы хранятся статически где-то внутри двоичного файла программы. Скорее всего, они загружаются в раздел «данные» только для чтения в памяти, но это неопределенное поведение.

При присваивании строкового литерала просто передается адрес первого байта; в этом случае char* ch указывает на «h» в «привет».

Примечание: Изменение статических строк - неопределенное поведение! Хотя вы можете получить указатель, любое назначение опасно.

1 голос
/ 30 июня 2011

Здесь происходит несколько вещей.

"hello" равно { 'h', 'e', 'l', 'l', 'o', '\0' }.Т.е. это массив символов.Массивы могут быть неявно преобразованы в соответствующий тип указателя.Таким образом, оператор здесь действительно создает (статический) массив символов и назначает указатель на первый элемент переменной ch (кстати, плохое именование).

0 голосов
/ 30 июня 2011

оператор компилируется в:

080483b4 <main>:
 80483b4:   55                      push   %ebp
 80483b5:   89 e5                   mov    %esp,%ebp
 80483b7:   83 ec 10                sub    $0x10,%esp
 80483ba:   c7 45 fc 94 84 04 08    movl   $0x8048494,-0x4(%ebp)
 80483c1:   c9                      leave  
 80483c2:   c3                      ret

строка в 0x8048494 это "привет \ 0", как видно из xxd:

0000490: 0100 0200 6865 6c6c 6f00 0000 011b 033b  ....hello......;
...