2012-06-12 1 views
-6

Можно создать дубликат:
What is the difference between char a[] = “string”; and char *p = “string”;В чем разница между ними? (Голец)

Не могли бы вы объяснить, в чем разница между ними? ^^

  //difference between: 
      char* sz1 = "blah"; 
      char sz2[] = "blah"; 

      //and also please explain these 
      char *sz3 = new char[512]; 
      char *sz4[512] = { 0, }; 
      char sz5[512]; 
+2

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

+0

Клянусь, этот точный вопрос был задан только вчера. –

+0

Это домашнее задание? – Saphrosit

ответ

2

"blah" является const char [5]. В первой строке этот массив распадается на указатель, который будет храниться в вашей переменной как указатель на первый элемент. Он также является указателем на не-const символы, которые указывают на const-символы. Оно должно быть:

const char *sz1 = "blah"; 

Во втором (спасибо Джрок), он создает реальный массив и инициализирует его с {'b', 'l', 'a', 'h', '\0'}.

char *sz3 = new char[512]; 

Это выделяет 512 * sizeof (char) байт памяти для символов и sz3 будет указывать на начало. Это сохраняется в куче, в отличие от стека, поэтому не забудьте указать delete[].

char *sz4[512] = { 0, }; 

Это создает массив из 512 указателей на символы и инициализирует их все до 0 (NULL). Запятая не нужна, ее легче добавить в список инициализаторов. spiral rule может использоваться здесь для определения sz4 is an array of 512 (one right) pointers (one left) to char (two left).

char sz5[512]; 

Это создает массив (в стеке) из 512 символов.

Все, кроме второго, могут быть заменены на std::string.

+1

'char sz2 [] =" blah ";' отлично, это просто сокращение для 'char sz2 [] = {'b', 'l', 'a', 'h', '\ 0'};' – jrok

+0

@jrok, Хорошая точка. Я все еще думал о указателях. – chris

-1

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

В-третьих, вы выделяете 512 байт памяти и присваиваете sz3 его адресу.

Для четвертого вы объявляете массив из 512 указателей символов, но ваше задание (насколько мне известно) неверно.

И, наконец, пятый оператор создает массив из 512 символов.

Смежные вопросы