В C я заметил, что есть несколько способов объявить массив символов. В чем разница между:

  1.  

    char arr[10] = "abcdefghij";
    
  2.  

    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

Почему они разные?

-2
Jesus Garcia 14 Дек 2014 в 01:29

4 ответа

Лучший ответ

Поскольку 1 - это массив символов, а второй - массив массивов, поскольку "a" на самом деле представляет собой массив из 2 символов 'a' и '\ 0'

1
Bogdan V. 14 Дек 2014 в 01:32

arr - это вектор char из 10 элементов, а arr2 - вектор указателей на символы из 10 элементов.

char arr2[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};

Он равен arr.

0
Alex 14 Дек 2014 в 01:39

В первом вы просто объявляете строку, а во втором вы создаете 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" ;
0
Macit 14 Дек 2014 в 01:50

Чтобы понять это поведение, вы должны знать разницу между строками и символами. Первые создаются с помощью " и могут содержать несколько символов, а вторые создаются с помощью ' и представляют только один символ. Поскольку вы использовали " при инициализации массива, вы создали массив строк, а не символов. Теперь строки представлены указателями на символы. Поэтому компилятор хотел, чтобы вы создали массив указателей на символы вместо массива символов.

0
Philipp Murry 14 Дек 2014 в 01:56