Сравнение массива char и указателя char - PullRequest
3 голосов
/ 23 апреля 2019

Играя вокруг, я нашел результат, который я не могу обдумать, который включает в себя массивы символов и указатель.

char charArray[] = "Array";
char* charPtr1 = "Array";
char* charPtr2 = "Array";

Почему charArray != charPtr1/2, но charPtr 1 == charPtr2?

Я думаю, что при создании charPtr1, он будет создавать временный массив и указывать на него.Если это так, то почему они не одинаковы?

Ответы [ 3 ]

4 голосов
/ 23 апреля 2019
char charArray[] = "Array";
char* charPtr1 = "Array";
char* charPtr2 = "Array";

почему charArray! = CharPtr1 / 2, а charPtr 1 == charPtr2?

charArray на самом деле char charArray[6] = { 'A', 'r', 'r', 'a', 'y', 0 };, поэтомуявляется массивом, содержимое которого может быть изменено

charPtr1 и charPtr2 являются указателями на char, поэтому ни один из них не может быть равен charArray (кромепосле charPtr1 = charArray; и т. д. конечно)

Факт charPtr1 и charPtr2 является оптимизацией компилятора, что для обнаружения литеральной строки "Array" используется несколькораз, определяет его один раз и использует его адрес для инициализации двух переменных

4 голосов
/ 23 апреля 2019

Это может помочь.

Разборка

char charArray1[] = "Array";
char* charPtr1 = "Array";
char* charPtr2 = "Array";

с GCC8.3 показывает

charArray1:
        .string "Array"
.LC0:
        .string "Array"
charPtr1:
        .quad   .LC0
charPtr2:
        .quad   .LC0

Другими словами, два указателя указывают на одну и ту же ячейку памяти, содержащую строку «Массив», в то время как массив содержит собственную копию строки.

Как следует из ссылки, память для массива char разделена таким же образом из-за различных рассматриваемых типов. Что касается указателей, поскольку их работа заключается в том, чтобы просто указывать на некоторые данные, возможно, компилятор решит оптимизировать дублированные выделения для одних и тех же литеральных данных.

Буквальные данные для указателей доступны только для чтения.

1 голос
/ 23 апреля 2019

Первый char charArray[] = "Array"; эквивалентен char charArray[] = {'A', 'r', 'r', 'a', 'y', '\0'}, который является инициализацией объекта массива с автоматической продолжительностью хранения.

В случаях 2, 3 оба указателя указывают на первый элемент одного и того же объекта массива, что означает, что указатели сравниваются одинаково. Стандарт определяет, что 6.5.2.5(p7):

Строковые литералы и составные литералы с константными типами, не нужно обозначать отдельные объекты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...