int a = 10;
int *p = &a;
*p = 20; /* Is this a valid statement? */
我明白,如果我做int *p;
,然後如果我做*p = 10
,它是無效的,因爲我還沒有分配任何內存p
。但是,我想知道如果初始化指向某個地址的指針分配內存到該指針或不?我是否需要將內存分配給已初始化的指針?
int a = 10;
int *p = &a;
*p = 20; /* Is this a valid statement? */
我明白,如果我做int *p;
,然後如果我做*p = 10
,它是無效的,因爲我還沒有分配任何內存p
。但是,我想知道如果初始化指向某個地址的指針分配內存到該指針或不?我是否需要將內存分配給已初始化的指針?
int a = 10;
int *p = &a;
*p = 20; /* Is this a valid statement? */
答案就在這種特殊情況下YES
。
但是,當你這樣做:
int *ptr; //declaration of pointer variable
*ptr = 20; // It means you are assigning value 20 to the variable where `ptr` points to.
但實際上ptr
不指向任何地方,基本上就意味着它有indeterminate value
。
這樣做*ptr = 20
會將值20放到由ptr
指向的內存地址。 所以在你區分它是有效的,因爲&a
是有效的內存位置和p
開始指向該變量的時候我們做p= &a
這就是所謂的Undefined bahavior
。
因此*p = 20
意味着實際上使用指針p
更改或分配值a
。
不,它不分配內存。您的p
實際上指向與&a
相同的位置,並在*p = 20;
中修改相同的內存。這不會因爲您引用分配的內存而崩潰(對於a
)。如果這是你真正想要的只取決於你。
我想知道初始化指向某個地址的指針是否會分配內存嗎?
它不分配任何內存。由於p
一個指向一個已分配的內存
int a = 10; // a is statically allocated and value 10 is assigned.
int *p = &a; // p is pointed to address of a.
*p = 20; // at this point p points to that statically allocated memory
好吧,所以我只是修改標記爲'a'的內存位置。 – user1624400
@ user1624400對。它的內存相同。我用更多細節更新了答案 –
不,沒有必要的。因爲你的指針指向a
變量的地址。所以,當你使用*p = 20
時,a
的值將會改變。
所以,你的問題的答案是YES
。 :)
但是,我想知道是否初始化指向某個地址的指針分配內存或不是?
你是什麼意思「分配內存給它」?當你創建一個指針時,你正在分配(靜態)它的內存,換句話說,它需要內存來保持現有的內存。
除此之外,還有指針指向的內存。當您說int a = 10
時,您正在創建一個int並分配足夠大的內存空間來容納它。
然後說出p = &a
表示:「我的指針必須指向存儲地址a
」。顯然你已經分配了a
,所以你可以安全地使用*p
,但通常情況下這是不正確的,你可能有一個未初始化的指針指向某個非法地址。
int a = 10;
int *p = &a;
我在想,如果初始化一個指向某個地址分配內存給指針或不是?
號的a
和p
變量需要棧上分配,或者如果他們的功能之外,他們會被分配的內存爲全局變量。編譯器將自動爲您完成此,即使你只是有...
int a;
int* p;
...沒有= <expression>
指定其初始值。發生的情況基本上是,在內存中的某個地址處,將保留大量字節(可能是4或8),以將您標識的值存儲爲a
,並且在另一個地址處將存儲更多內存(可能爲4或8字節)保留存儲您調用p
的值。
的p
與&a
簡單地拷貝a
數字地址到內存p
初始化......它不會引起任何[1],也將他們的內存分配。
它可以幫助視覺像這樣,用一些虛構的地址...
MEMORY-ADDRESS CONTENTS NAME
1000 10 a
2000 1000 p
這裏,p
「點」到a
因爲p
的存儲保持a
的地址的內容。但編譯器會選擇a
和p
的地址,而不管其值是否有任何初始化或其他更改。
我想在這裏混淆你的是,使用指針當我們經常分配內存......是這樣的:
p = new int;
這樣做是找到一個動態的int
運行一些內存,加載地址的內存轉換爲p
,所以我們可以開始將它稱爲p
並使用它來存儲int
值。當我們完成它時,我們可以delete p
將內存返回給系統,以便在完成另一個new
時可以回收和使用它。這種類型的分配需要在代碼中明確執行(或者在您調用的某個庫函數的代碼中)。
[1] - 優化器可能會選擇不爲a
和/或p
分配實際的內存 - 使用CPU寄存器代替,但不會影響程序的功能行爲(可能會影響性能)。
A 指針只是一個號碼。它有一個特殊的類型來確保它可以代表正確的數字範圍,並有助於程序的理解,但基本上它只是一個數字。
number代表內存地址。你不能只做這些:你需要從某個地方得到一個有意義的地址。
您可以:
p = &a
;或p = malloc(size)
就是這樣,一旦你有一些內存的地址,你就大功告成了!您現在可以使用解除引用指針在您喜歡的任何位置使用*
運算符:*p = somedata
。
說一個指針只是一個數字是不準確的。在許多實現中,指針只是一個數字。但是,指針也可能有其他形式。例如,它可能是一對數字或地址和存儲在該地址的一些附加信息的組合。 –
@EricPostpischil:非常真實,我自己實現了FDPIC系統,但我們不要不必要地使事情複雜化。即使在這些情況下,擴展指針可以被看作是一個「數字」,儘管解釋更復雜。 FDPIC改變了函數指針的形式,但沒有修改數據指針。 – ams
您已將內存分配給'p'。 –
內存是'a',現在它的值是'20'。 –
請考慮重寫最後一句,並將* it *替換爲它應該引用的內容。目前,「某地址」和「指針」之間存在混淆。這就是爲什麼你得到「是」和「否」的答案。 – dasblinkenlight