Есть множество вопросов о указателях здесь, на SO, и бесчисленных ресурсах в Интернете, но я до сих пор не смог это понять.Тип указателя?
This answer котировки A Tutorial on Pointers and Arrays in C: Chapter 3 - Pointers and Strings:
int puts(const char *s);
На данный момент, игнорирующие Уст. Параметр, переданный в
puts()
, является указателем, то есть значением указателя (поскольку все параметры в C передаются по значению), а значение указателя - это адрес, на который он указывает, или, просто, адрес. Таким образом, когда мы пишемputs(strA);
, как мы видели, мы передаем адресstrA[0]
.
Я этого не понимаю.
Почему
puts()
нужен указатель на строку постоянной?puts()
не изменяет и не возвращает свой аргумент, просто записывает его вstdout
, а затем строка отбрасывается.Игнорирование почему, как же это прототип
puts()
«s, который в явной форме принимает указатель на строковую константу, принимает строковый литерал, а не указатель на один? То есть, почемуputs("hello world");
работает, когда прототипputs()
указывает, чтоputs()
нуждается в чем-то более похожем наchar hello[] = "hello world"; puts(&hello);
?Если вы даете, например,
printf()
указатель в строку постоянной, которая, по-видимому, что он хочет, GCC будет жаловаться и ваша программа будет сегментации, потому что:error: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[6]’
Но давая printf()
, строковая константа, а не указатель на строку, отлично работает.
This Programmers.SE question's answers сделать для меня большой смысл.
Отправляя ответы на этот вопрос, указатели - это просто цифры, которые представляют собой положение в памяти. Номера для адресов памяти являются неподписанными ints, а C записывается на (родной) C и сборке, поэтому указатели просто определены в архитектуре uint
s.
Но это не так, так как компилятор очень ясно в своих ошибках о том, как int
, int *
и int **
являются не то же самое. Это путь, который в конечном итоге указывает на что-то в памяти.
Почему функции, которые нуждаются в указателе принять то, что является не указателя, и отклонить указатель?
Я знаю, что «строковая константа» на самом деле представляет собой массив символов, но я пытаюсь упростить здесь.
Я прочитал ваш вопрос. Это немного сбивает меня с толку. Не могли бы вы просто сказать мне, что вы ожидаете? –
@JafferWilson там, я надеюсь, что я сделал это яснее – cat
Возможно, вы захотите прочитать, что происходит с массивом при передаче функции (в C). – alk