[英]lvalue required as increment operand error-pointers
我只是想了解C中的指針概念並遇到了這個錯誤。 我得到了以下代碼的“左值作為遞增操作數”錯誤。 請幫我理解是什么問題。
#include<stdio.h>
int main()
{
char *s[] = {"black", "white", "pink", "violet"};
++s; //error at this line
printf("%s\n", *s);
char **ptr[] = {s+3, s+2, s+1, s}, ***p;
p = ptr;
++p;
printf("%s", **p+1);
return 0;
}
s
是一個指向char
的指針數組。 數組名稱是不可修改的l值。 ++s
正在修改無法修改的s
。
正如我們所看到的,當我們聲明一個數組時,為數組的單元分配了一個連續的內存塊,並且還分配了一個指針單元(適當類型)並初始化為指向數組的第一個單元。 該指針單元格被賦予該數組的名稱 。 為陣列單元分配存儲器時,起始地址是固定的,即在程序執行期間不能更改。 因此,不應改變指針單元的值。 為確保不更改此指針,在C中, 數組名稱不能用作賦值語句左側的變量,即它們不能用作左值 。 相反,如果需要,可以聲明適當類型的單獨指針變量並將其用作左值。
建議閱讀: 數組名是C中的指針嗎?
問題是在表達式中,數組名稱被轉換為指向數組第一個元素的指針的右值。 這是一個類型的臨時對象,在您的情況下創建char **
。 您可能不會增加臨時對象。 這種情況類似於以下代碼段中的情況
int x = 10;
++( x + 5 );
編譯器將發出類似的錯誤消息。
例如,在您的代碼段中,您可能無法編寫
char **ptr[] = { ++(s+3), s+2, s+1, s};
編譯器將發出相同的錯誤。 事實上,當你編寫++s
它等同於++( s + 0 )
,你不處理原始數組,而是使用一些臨時指針,即rvalue`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.