簡體   English   中英

需要左值作為增量操作數

[英]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++完成),並且可以修改指針地址,因此我將數組的地址復制到單獨的指針中, 然后對其進行了遞增。

如果您願意,我敢肯定您可以減少表示法,但我希望您明白這一點。

xy是數組,而不是指針。

它們在大多數表達式上下文(例如您的增量表達式)中衰減為指針,但它們衰減為rvalues,而不是lvalues,並且您只能將增量運算符應用於lvalues。

由於您已將xy都定義為數組,因此無法修改它們。 一種可能性是改用指針:

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 = paa++是非法的”,它表示數組的名稱是初始元素位置的同義詞。”

但是為什么在函數參數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM