2010-06-03 3 views
4
char *sample = "String Value"; 

&sample является указателем на указатель "String Value"вопрос относительно указателя в языке Си

является приведенное выше утверждение верно?

Если справа вверху заявление, что является эквивалентом &sample если моя декларация

char sample[] = "String Value" 
+1

образец [] перезаписывается в то время как * образец нет .. – Jack

+0

Спасибо всем за ваши ответы и комментарии. Благодарим aJ за редактирование и пометку моего вопроса. Это мой первый вопрос здесь, и я думаю, что мне нравится этот сайт и сообщество! d (^ - ^) b – din

ответ

6

В первом есть Создано 2 объектов.

Первый - это char * (указатель на символ), который называется sample, а другой - это безымянный массив из 13 символов, содержащих символы строки. В этом случае &sample указывает адрес объекта sample, который является адресом указателя на символ, поэтому указатель на указатель на символ.

Во втором примере существует только один созданный объект; массив из 13 символов, называемый sample, инициализированный символами строки. В этом случае &sample дает адрес объекта sample - так, указатель на массив-13-символов.

Во втором примере нет «эквивалента» для &sample в первом примере в смысле значения указателя на указатель на символ. Это потому, что : нет значения указателя на символ, чтобы принять адрес. Есть только массив.

+0

Спасибо, кафе. Вы действительно заслужили репутацию 25k! – din

+0

Оба примера имеют два объекта. Оба они имеют строковый литерал (массив символов). В первом создается указатель, который указывает на строковый литерал. Во втором создается массив, который содержит копию строкового литерала. –

-2

& образец адрес указателя, который указывает на «String Value».

Во втором примере, так как имя массива, который не сопровождается индексом интерпретируется как указатель на начальный элемент массива, что означает

sample 

и

&sample[0] 

одинаковы, поэтому & образец также является адресом указателя, указывающего на строку.

+0

Это неправда. '& sample' - * не * адрес указателя; это адрес массива, который никоим образом не является взаимозаменяемым с адресом указателя. – caf

+0

Во втором примере 'sample' является массивом. В * определенных контекстах *, он автоматически распадается на указатель, но различие имеет важное значение. (Например, 'sizeof sample' и' sizeof & sample [0] 'будут отличаться.) – jamesdlin

-1

В массивах и указателях C более или менее взаимозаменяемы. Вы можете обрабатывать имя массива, например, указатель, а указатель - это имя массива.

Если вы берете адрес указателя (&) указателя, то, конечно, вы получаете указатель на указатель.

+3

Принимая адрес с '&', это, однако, одно из тех случаев, когда вы * не можете обрабатывать имя массива, например, указатель, и наоборот. – caf

+0

«более или менее взаимозаменяемый» на самом деле ничего не разъясняет для новичка. (1) «То же самое», не эквивалентно «иногда переменная, объявленная как массив, распадается на указатель на начало массива», и (2) вам лучше указать ситуации, когда это произойдет. – detly

0

Хотя указатели обеспечивают огромную мощность и гибкость для программистов, они могут использовать производные причины, если они не обрабатываются должным образом. Для предотвращения ошибок рассмотрите следующие меры предосторожности, используя указатели. Мы должны убедиться, что мы знаем, где указывается каждый указатель в программе. Вот некоторые общие замечания и общие ошибки, которые могут быть полезны для запоминания. *ptr++, *p[],(ptr).member

0

В первой части & образца возвращает адрес «» образца указателя, созданный и во втором случае начального адреса строки, созданной в качестве объекта.

Смежные вопросы