2013-05-09 2 views
7

*(a ++)はエラーを出すが、*(a + 1)を出さない?ここでaは配列名ですか?次のコードで

void main() 
{ 
    char a[]={1,5,3,4,5,6}; 
    printf("%d\n",*(a++)); //line gives error: wrong type argument to increment 
    printf("%d\n",*(a+1)); 
} 

ライン4とライン5との違いは、私はすべてのエラーを取得またはライン5

+1

私はC言語では良くありませんが、おそらくダブルインクリメント(つまり、 '++'演算子)配列を使うことはできません。 – Voitcus

+9

トピックは完全にオフですが、 'void main()' ==悪い! 'void main()'と考えると、誰かがあなたをスティックで叩くのを描きます。 'int main()'、いつも! – Yuushi

答えて

26

aと警告していないです何であるので、配列オブジェクトではなくポインタであります配列オブジェクトに操作a++ を使用できませんでした。等価であるので:あなたは、アレイに割り当てるここで

a = a+ 1; 

あなたa配列の要素1へのポインタリターン

a + 1 C.

では許可されていない新たな価値をオブジェクト、それが許可されています

3

'a' は、 constポインタのように動作します。 'a'は値またはポイントしているアドレスを変更できません。これは、コンパイラが静的に配列のサイズのメモリを割り当てており、参照先のアドレスを変更しているためです。

代わり

void main() 
{ 
char a[]={1,5,3,4,5,6}; 
char *ch; 
ch=a; 
printf("%d\n",*(ch++)); //this lines gives error no more 
printf("%d\n",*(ch+1)); 
} 
+0

'a'は決してconstポインタではありません。それは配列です。 –

+1

@ H2CO3私は 'a'をconstポインタと仮定しました。私はそれをconstポインタと呼んでいませんでした。 –

+0

でもそれは間違っています... –

4

オーケー真剣に悪いコーディングプラクティスを、次のようにあなたがそれを行うことができますへの暗黙の参照であるため、

printf("%d\n",*(a++)); //this lines gives error: wrong type argument to increment 

を使用することはできません。しかし、まずは、あなたの問題に対処しましょう配列。あなたはこの行うことができます

+一方のオペランドを変更する++試みは、単に一定のa値に1を追加しますので、また*(a++)

char b[]={1,5,3,4,5,6}; 
char *a = b; 
printf("%d\n",*(a++)); //this lines will not give errors any more 

とあなたが行くオフ...

*(a+1)と同じではありません。

+0

また、 'a ++'は 'a'の古い値を評価し、' a'の値はインクリメントされます(ポストインクリメント) – Joe

関連する問題