2013-04-28 18 views
1

對於以下程序中的printf()語句,我得到錯誤" lvalue required as increment operand|"爲什麼* list ++或*(list ++)爲列表[4]工作,但對指定列表值的指針工作正常?

#include<stdio.h> 

int main(void) 
{ 
int list[4]={12,22,32,42}; 

printf("The result of *list++ is %d",*list++); 

printf("\nThe result of *(list++) is %d",*(list++)); 

return 0; 
} 

但在下面的程序*myptr++*(myptr++)作品罰款其被分配的list基地址的指針myptrIdeone Link

#include<stdio.h> 

int main(void) 
{ 
int list[4]={12,22,32,42},*myptr; 
myptr=list; 

printf("The result of *myptr++ is %d",*myptr++); 

myptr=list; 
printf("\nThe result of *(myptr++) is %d",*(myptr++)); 
} 

爲什麼會出現兩者之間的差異是什麼?如何解釋呢?這個問題冒出我發現通過以下問題將會發布後幾分鐘back.Look爲H2CO3的回答。

What is the difference between *myptr++ and *(myptr++) in C

+8

因爲數組和指針是不一樣的。 – 2013-04-28 12:16:14

+0

@AlokSave我們在同一時刻發佈!整齊。 – 2013-04-28 12:16:42

+0

@AlokSave首次與Alok Save.I進行任何溝通,只在飛機上看到他的照片。 – 2013-04-28 12:18:57

回答

3

可變list是一個數組,不是指針。指針算術運算是爲指針定義的,但不適用於數組。數組的名稱可用於生成指針 - 例如,在像myptr = list這樣的表達式中,但這並不意味着數組本身可以用作指針。特別是,陣列是不是修改lvalue,這是說,你不能重新分配陣列本身(儘管你可以指定數組的)的一個奇特的方式。

+0

數組是左值,但不是_valifiable左值_。 – 2013-04-28 18:43:17

+0

@DanielFischer感謝您的評論!我編輯了答案以反映你的觀點。 – dasblinkenlight 2013-04-28 20:17:39

2

因爲指針不是數組。


你不能增加一個陣列。試想一下,這是沒有道理的。一個數組不是一個指針,它不能被視爲一個。這就是爲什麼C標準要求它不是一個可修改的左值(這對你想改變的任何東西都是需要的)。

+0

什麼是我提到的錯誤的簡單英語解釋'作爲增量操作數需要左值|' – 2013-04-28 12:17:12

+0

@SheerFish [http://en.wikipedia。 org/wiki/Value_(computer_science))基本上,數組不能被修改,只能是其元素。 – 2013-04-28 12:19:25

+0

我想稍微小瞧一下 - *爲什麼*沒有意義?好的,'sizeof'不起作用,你可能會失去你對它的所有引用。但這正是函數參數和'malloc'ed數組發生的情況。 – Elazar 2013-04-28 13:55:26

1

數組不是指針。數組只是一個連續的內存。當您在表達式中提及數組的名稱時,它會「衰減」到表示其起始地址的數字(指針類型)。這個數字不能增加,減少或分配 - 它不是一個lvalue - 因爲陣列所在的地方不會改變。

說你有

int a[4] = { 1, 2, 3, 4}; 

如果在一些神奇的方式,你碰巧知道到底是什麼將是地址 - 爲0x1000 - 例如,你可以替換與代碼中的任何次數的a( (INT *)(0×1000))。

聲明*a++=5變成2個語句:

*a=5; 
a++; 

正如我們說的,就相當於:

*((int*)(0x1000))=5; 
((int*)(0x1000))++; 

現在,是什麼*((int*)(0x1000))=5是什麼意思?這很簡單:在地址0x1000處寫入5。因爲表達式*(指針值)的左值。但((int*)(0x1000))++是什麼意思?好吧,我不知道。你不能增加0x1000。

+0

「數組是其起始地址的地址」 - 不,它不是; 「但是不可能對它進行指針運算。」 - 好吧,'int arr [3]; *(arr + 1)= 42;' – 2013-04-28 12:20:08

+0

我修正了第一句 - 這不是我的意思。在你的例子中,你使用數組衰減到的值進行指針運算。 – Elazar 2013-04-28 12:21:38

+0

我意識到這一點,也許這將有助於解釋OP更多一點。 – 2013-04-28 12:22:10

-1

在大多數情況下,你可以使用簡單的假設:int list[4]等於​​3210。所以,這是不可修改

還記得當你得到sizeof(list)這個簡單的假設不起作用。例如:

int list[4]; 
size_t s = sizeof(list); // s = sizeof(int)*4 

int * const list; 
size_t s = sizeof(list); // s is equal to size of pointer 
+0

感謝downvoting。答案已改善,現在可以嗎? – kotlomoy 2013-05-18 19:23:05

相關問題