2011-06-03 2 views
6

это, вероятно, по существу тривиальная вещь, но она несколько ускользает от меня, до сих пор ..приращением массив указателей в C

char * a3[2];
a3[0] = "abc";
a3[1] = "def";
char ** p;
p = a3;

это работает:

printf("%p - \"%s\"\n", p, *(++p));

это не имеет:

printf("%p - \"%s\"\n", a3, *(++a3));

ошибки я клоню компиляцию:

именующие требуются в качестве приращения операнда

, что я делаю неправильно, почему и что это решение для «a3»?

+0

Переменная a3 объявлена ​​как массив символов, я думаю, вы хотите объявить ее как массив указателей, поэтому она должна читать char * a3 [2] вместо char a3 [2] – David

+0

, что было ошибкой копирование кода, вы правы, да, это был массив указателей, спасибо за указание на это – XXL

ответ

4

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

+0

Это, кажется, самый точный ответ, спасибо – XXL

4

Вы не можете назначить a3, и вы не можете увеличить его. Имя массива является константой, его нельзя изменить.

c-faq

+0

@XXL. Как вы его объявили, 'a3' не является указателем, периодом. Вероятно, в вашем вопросе также отсутствует '*' ('char * a3 [2]'?) – cnicutar

+0

ему не хватало звездочки из-за неудачной пасты, что я хотел услышать, так это то, что «имя массива постоянное, поэтому оно не может быть изменено», что объясняет это достаточно хорошо. у вас не было этой части в вашем первоначальном ответе, поскольку это появилось только после того, как вы отредактировали свое сообщение - вот почему я задал следующий вопрос «почему». во всяком случае, он был рассмотрен к настоящему времени, спасибо – XXL

0

Попробуйте

char *a3Ptr = a3; 
printf("%p - \"%s\"\n", a3, *(++a3Ptr)); 

В Си массив символов [] отличается от полукокса *, даже если вы можете использовать символ * для ссылки на первое местоположение массива полукокса.

не являются указателями «p» и «a3» указателям?

Да, но a3 является постоянным. Вы не можете его изменить.

0

a3 - это имя массива. Это о нем как о постоянном указателе.

Вы не можете изменить его. Вы можете использовать a3 + 1 вместо ++a3.

Другая проблема с использованием «%s» для аргумента *(++a3). Поскольку a3 является массивом символов char, *a3 является символом, а соответствующий спецификатор формата должен быть %c.

+0

a3 - это массив символов char *, поэтому синтаксис должен быть в порядке ... Я неправильно читал его сначала ... или, может быть, он был отредактирован после того, как вы разместили это. – Pablitorun

0

Вы не можете увеличивать или указывать любой массив символов на что-то еще после создания. Вам нужно изменить или получить доступ с помощью индекса. like a[1]

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