Ответ 1
Первый - это массив, другой - указатель.
Объявление массива "char a[6];
" требует, чтобы пространство для шести символов было отложено, чтобы быть известным под именем "a.
". То есть есть место с именем "a
", в котором шесть символов могут сидеть. Объявление указателя "char *p;
", с другой стороны, запрашивает место, в котором содержится указатель. Указатель должен быть известен под именем "p,
" и может указывать на любой char (или непрерывный массив символов) где угодно.
Утверждения
char a[] = "hello";
char *p = "world";
приведет к созданию структур данных, которые могут быть представлены следующим образом:
+---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+
+-----+ +---+---+---+---+---+---+
p: | *======> | w | o | r | l | d |\0 |
+-----+ +---+---+---+---+---+---+
Важно понимать, что ссылка, такая как x [3], генерирует другой код в зависимости от того, является ли x массивом или указателем. Учитывая вышеприведенные объявления, когда компилятор видит выражение a [3], он испускает код, начинающийся с места "a", перемещаясь три мимо него и извлекая там символ. Когда он видит выражение p [3], он испускает код для начала в месте "p", извлекает здесь значение указателя, добавляет три к указателю и, наконец, извлекает символ, на который указывает. В приведенном выше примере оба параметра [3] и p [3] являются символом "l", но компилятор попадает туда по-другому.
Вы можете использовать поиск, есть тонны объяснений по этому вопросу в Интернете.