[英]lvalue required as increment operand
gcc 4.4.4
我究竟做錯了什么?
char x[10];
char y[] = "Hello";
while(y != NULL)
*x++ = *y++;
非常感謝您的任何建議。
x++
是x = x + 1
的簡稱。 但是, x
是一個數組,您不能修改數組的地址。 變量y
也是如此。
您可以聲明一個整數i
並遞增該整數,然后訪問數組的第i
個索引,而不是嘗試遞增數組。
char x[10], y[5] = "Hello";
int i = 0;
while (y[i] != 0)
{
x[i] = *y[i];
i++;
}
x[i] = 0;
您很可能會成為一個普遍的誤解的受害者,即“數組是指針”,即,當您定義數組時,您實際上得到的是一個普通指針,該指針指向某處分配的某些內存塊。 在您的代碼中,您正在嘗試增加該指針。
該代碼不起作用,因為實際上數組不是指針。 數組是數組。 數組不能遞增。 C語言中沒有“遞增數組”之類的操作。 實際上,C語言中的數組本身是不可修改的左值。 C語言中沒有可修改數組本身的操作(只能修改單個元素)。
如果要使用“滑動指針”技術遍歷數組(這實際上是您嘗試做的),則需要顯式創建指針,並使它們指向數組的起始元素
char *px = x;
char *py = y;
之后,您可以根據需要增加這些指針的數量。
C語言中的數組確實是指針,但是是常量指針,這意味着聲明后不能更改它們的值。
int arr[] = {1, 2, 3};
// arr is declared as const pointer.
(arr + 1)
是可能的,但是arr++
是不可能的,因為arr
因為它是常數而不能存儲另一個地址。
char x[10];
char y[] = "Hello";
char *p_x = &x[0];
char *p_y = &y[0];
while(*p_y != '\0') *p_x++ = *p_y++;
由於您不能修改數組地址(在代碼中由x++
和y++
完成),並且可以修改指針地址,因此我將數組的地址復制到單獨的指針中, 然后對其進行了遞增。
如果您願意,我敢肯定您可以減少表示法,但我希望您明白這一點。
x
和y
是數組,而不是指針。
它們在大多數表達式上下文(例如您的增量表達式)中衰減為指針,但它們衰減為rvalues,而不是lvalues,並且您只能將增量運算符應用於lvalues。
由於您已將x
和y
都定義為數組,因此無法修改它們。 一種可能性是改用指針:
char x[10];
char *xx = x;
char *y = "Hello";
while (*y != '\0')
*xx++ = *y++;
請注意,我還修復了您的終止條件-指針不會僅僅因為它已到達字符串的末尾而變為NULL
。
在大多數時候,數組就像一個指針。
只記得您不能修改數組!
y++
是y = y + 1
。
char y[] = "Hello";
因此,當您使用y++
時,確實要修改數組!
它將產生error: lvalue required as increment operand
。
我們無法修改數組名稱,但是f(int argv[])
argv++
呢?
K&R在第99頁中引述“數組名稱不是變量; 像a = pa
和a++
是非法的”,它表示數組的名稱是初始元素位置的同義詞。”
但是為什么在函數參數func(char *argv[])
,盡管argv
是一個數組名,我們仍然可以執行argv++
。
在int *a[10]
,我們不能像argv++
那樣做a++
argv++
。
數組的名稱是初始元素位置的同義詞。 --- K&R
arrayname++
是非法的。
在函數參數中,例如char *argv[]
,與char **argv
相同。 參數中的type *arrayname_para[]
type **arrayname_para
的另一個同義詞。
數組是常量指針。 我們無法更改它們。
int q;
int *const p = &q;
p = NULL; // this is not allowed.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.