簡體   English   中英

為什么可以為指針分配值?

[英]why a pointer can be assigned value?

我在這里有一個困惑:

int *a=*b;
a[1]=3;
a[2]=5

a是一個指針數組,並被賦值為b。 以我的理解,a []應該是地址,那么為什么在實踐中我們可以將值分配給指針(在本例中為a [])所在的位置? 有什么解釋嗎?

我假設這是C或Objective C / C ++的C子集,因為C +,Java,PHP和其他類似C的語言不使用指針。

每行使用代碼標簽和一條語句。

該聲明

int *a = *b;

創建一個作為int的指針。 不是指向int的指針,而是指向int的指針。

然后,無論b是什么,都將a中的當前地址設置為b的取消引用。 您沒有顯示b的聲明。 除非b的類型為int ** ,否則您應該收到編譯器警告。

a不是指針數組。 a是一個指向int的指針。 它可以指向單個int,也可以指向一個int數組。 編譯器無法區別。

如果b的類型為int **或指向int的指針,則您的語句將取消引用其中一個指針,並指向b內的第一個子數組。

編碼

a[1] = 3;

假定a是指向整數數組的指針,並且由於編譯器無法執行任何范圍檢查,因此它嘗試索引該數組並將值保存到指向的內存塊中的第二個int。 如果a指向的內存塊不足以包含至少2個整數,則此語句可能會在使用受保護內存的現代計算機上崩潰,也可能會覆蓋后面的內存。

作為@EdS。 在下面的評論中指出,這在業務中稱為

“未定義的行為”

如果要使用這樣的C指針,則要確保它確實指向有效內存,這是您的負擔,如果要像使用數組一樣使用指針,則負擔就很大了。您要確保不超出指針所指向的內存范圍。

但是,讓我們回答您的問題:

我在這里逐步介紹您的代碼(盡管出於示例目的對它進行了一些修改),並向您展示了它在假內存中的功能,因此您可以理解:

int b[4];

在這里,您分配了4個內存單元,並為b標記了包含第一個內存單元地址的內存單元:

variable     b                      
address      0x1   0x2 0x3 0x4 0x5 
memory      [0x2] [   |   |   |   ]

然后:

int* a = b;

在這里,您分配了一個新的存儲單元,該存儲單元可以包含一個地址(如使用指針類型聲明的地址),並為其分配b存儲單元的內容:

variable     b                       a
address      0x1   0x2 0x3 0x4 0x5   0x6
memory      [0x2] [   |   |   |   ] [0x2]

然后:

a[1]=3;
a[2]=5;

您正在將值設置為a[1] ,該值使用指針算術轉換為*(a+1) ,即地址0x2 + 1的內容,即0x3內容。 a[2] 現在的內存是:

variable     b                       a
address      0x1   0x2 0x3 0x4 0x5   0x6
memory      [0x2] [   |  3|  5|   ] [0x2]

我希望這個ASCII可以使數組的工作方式更加清楚! 而且,您一定應該閱讀Kernighan和Ritchie的書 ,以及本文檔 ,它們都很好地解釋了如何管理整個內存以及指針算術和數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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