В чем разница между переменными «* s» и «s»? - PullRequest
0 голосов
/ 02 февраля 2019

Если у меня есть эта переменная:

char *s = "house";

Какая разница, если я буду ссылаться на нее как *s и s в других частях моего кода?

Ответы [ 3 ]

0 голосов
/ 02 февраля 2019

*s и s[0] - это одно и то же, если это поможет.В этом случае это буква h, которая будет отображаться до тех пор, пока не будет изменена s.(h не следует изменять, и, в зависимости от вашей реализации C, может быть невозможно изменить, потому что "house" - это константный строковый литерал.)

Если он используется в контексте, которыйожидает, что char *, s - это целая строка.Но важно помнить, что он не является константой, хотя на что он изначально указывает.

В отличие от этого,

char c[] = "house";

объявляет и инициализирует c неизменнымзначение.Вы можете добавить ключевое слово const, чтобы сделать это более понятным, но это было бы просто украшением.Поскольку он инициализируется в скобках, его значение в смысле указателя не может быть изменено, а поскольку его начальное значение также является константой, его нельзя изменить.Обратите внимание, что вы можете уйти только без указания длины для массива из-за присваивания литерала - компилятор может сказать, что это массив из 6 символов из-за длины литерала.Если бы вы действительно указали его длину, он не был бы неизменным без ключевого слова const.

0 голосов
/ 03 февраля 2019

как относиться к строке как ко всем символам, а не только к первым?

В C код не ссылается напрямую на все символы строка .char *s указывает на один символ.По соглашениям стандартной библиотеки C, когда этот символ начинает строку , тогда считается, что s указывает на строку, но все еще только первый символ строки.Именно при проверке этого и последующих символов, вплоть до нулевых символов , этот код знает обо всей строке .

char x = *s;  // x assigned the value of the first character pointed to by s.

size_t  len = strlen(s); // len assigned the _length_ of the string 
// Length determined by walking the string until finding a null character '\0'.

// t is assigned the same pointer value as s.  Data they reference is not replicated.
// t and s both point to the same string.
char *t = s; 

char u[strlen(s) + 1];
strcpy(u, s);  // String data pointed to by s is coped to u.

В C: «A string - это непрерывная последовательность символов, оканчивающаяся и включающая первый нулевой символ.»

0 голосов
/ 02 февраля 2019

Когда вы ссылаетесь на переменную как *var, вы разыменовываете это, то есть значение оператора *var - это то, на что указывает var.Когда вы ссылаетесь на переменную как var (нет *), вы получаете доступ к ее фактическому содержимому, которое может содержать или не содержать значение адреса памяти, содержащего интересующие вас данные.

Это может немного смущать начинающих, поскольку синтаксис объявления переменной в качестве указателя (T *p) использует тот же оператор (*), что и оператор, используемый для разыменования указателя.

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