簡體   English   中英

lvalue需要作為增量操作數錯誤指針

[英]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.

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