В C я заметил, что есть несколько способов объявить массив символов. В чем разница между:
char arr[10] = "abcdefghij";
char* arr2[10] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j"};
-
gcc
говорит, что мне нужна звезда после символа в 2, а не в 1. - при печати 1 я могу использовать
printf("%s\n", arr); and it prints abcdefghij@
- при печати 2 я должен использовать цикл
for
-
Почему они разные?
4 ответа
Поскольку 1 - это массив символов, а второй - массив массивов, поскольку "a" на самом деле представляет собой массив из 2 символов 'a' и '\ 0'
arr
- это вектор char из 10 элементов, а arr2
- вектор указателей на символы из 10 элементов.
char arr2[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
Он равен arr
.
В первом вы просто объявляете строку, а во втором вы создаете 10 указателей на 10 строк. В качестве примера
char* arr2_0 = "a" ;
char* arr2_1 = "b" ;
char* arr2_2 = "c" ;
char* arr2_3 = "d" ;
char* arr2_4 = "e" ;
char* arr2_5 = "f" ;
char* arr2_6 = "g" ;
char* arr2_7 = "h" ;
char* arr2_8 = "i" ;
char* arr2_9 = "j" ;
Чтобы понять это поведение, вы должны знать разницу между строками и символами. Первые создаются с помощью "
и могут содержать несколько символов, а вторые создаются с помощью '
и представляют только один символ. Поскольку вы использовали "
при инициализации массива, вы создали массив строк, а не символов. Теперь строки представлены указателями на символы. Поэтому компилятор хотел, чтобы вы создали массив указателей на символы вместо массива символов.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.