如果我有:C中的確切別名是什麼?
int a= 10;
int *ptr = &a;
int *ptr_2 = ptr;
據說*ptr
而不是ptr
是a
的別名,但ptr_2
的ptr
別名或*ptr_2
的*ptr
別名?
我知道,一般來說,當兩個或更多的對象引用一個內存地址,而不是別名。所以這句話的關係,我可能會覺得,ptr_2
和ptr
是別名,但我不知道,因爲*ptr
和a
的關係......
那麼,什麼是,由C的角度來看,一個別名?
如果我有:C中的確切別名是什麼?
int a= 10;
int *ptr = &a;
int *ptr_2 = ptr;
據說*ptr
而不是ptr
是a
的別名,但ptr_2
的ptr
別名或*ptr_2
的*ptr
別名?
我知道,一般來說,當兩個或更多的對象引用一個內存地址,而不是別名。所以這句話的關係,我可能會覺得,ptr_2
和ptr
是別名,但我不知道,因爲*ptr
和a
的關係......
那麼,什麼是,由C的角度來看,一個別名?
你可以參考這個wiki上Pointer aliasing一個很好的解釋
走樣指情況相同的存儲空間可以使用 不同的名稱訪問。例如,如果一個函數採用兩個指針A和B的值相同的 ,那麼名稱A [0]將別名B [0]。在這種情況下,我們 表示指針A和B互相混淆。請注意, 指針混疊的概念沒有很好定義 - 兩個指針A和B可能互相替換,也可能不互相混用,具體取決於在使用A和B的函數中執行了哪些操作 。例如,在memcpy( A + 8,A,8),其中A是一個指向char類型的指針,目標和源指針不是別名,而是在memmove(A + 8,A,9)中。
我回答的部分「我不確定是因爲* ptr和a的關係」,我認爲其餘部分對您已經很清楚。
在C中,每個變量都有一個值和一個地址。後者指定變量在內存中的位置,它對於程序是唯一的。 int a
聲明一個地址爲&a
的變量。現在,當您將10
指定爲a
時,值10
被置於地址&a
。
當您聲明int *ptr = &a
時,新變量ptr
的地址爲&ptr
,值爲&a
。 現在,由於ptr
的類型爲int*
,因此您可以使用*ptr
直接轉到存儲在變量ptr
中的地址。這叫做dereferencing。
本質上,當您在您的程序中編寫*ptr
時,它意味着存儲在ptr
中的地址的值,此值爲10
。如果您稍後使用*ptr = 20
進行分配,則存儲在ptr
中的地址值將更改爲20.在此情況下,存儲在ptr
中的地址爲&a
,因此a
的值將更改爲20
。希望這可以幫助。
別名意味着共享相同的內存位置 int x = 50; int & y = x;
現在x和y共享相同的內存位置。 * ptr是指針變量並指向其他變量。
-1。 C不是C++。 – 2014-09-06 07:20:59
這個wiki也是矛盾的:它說A和B互相混淆,而且A [0],即* A和B [0],即* B,是別名... – xdevel2000 2014-09-06 07:23:22
@ xdevel2000維基說,「別名是指可以使用不同名稱訪問相同內存位置的情況。」現在,由於「A」和「B」具有相同的值,因此「* A」和「* B」指的是相同的值地址空間,即相同的內存位置。 – Nishant 2014-09-06 07:34:28
@Nishant,因此它似乎明白,A和B是別名,因爲它們作爲值具有相同的地址;也* A和* B是別名,因爲他們是去相同的地址... – xdevel2000 2014-09-06 07:42:59