2014-09-06 75 views
0

如果我有:C中的確切別名是什麼?

int a= 10; 

int *ptr = &a; 
int *ptr_2 = ptr; 

據說*ptr而不是ptra的別名,但ptr_2ptr別名或*ptr_2*ptr別名?

我知道,一般來說,當兩個或更多的對象引用一個內存地址,而不是別名。所以這句話的關係,我可能會覺得,ptr_2ptr是別名,但我不知道,因爲*ptra的關係......

那麼,什麼是,由C的角度來看,一個別名?

回答

0

你可以參考這個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)中。

+0

這個wiki也是矛盾的:它說A和B互相混淆,而且A [0],即* A和B [0],即* B,是別名... – xdevel2000 2014-09-06 07:23:22

+2

@ xdevel2000維基說,「別名是指可以使用不同名稱訪問相同內存位置的情況。」現在,由於「A」和「B」具有相同的值,因此「* A」和「* B」指的是相同的值地址空間,即相同的內存位置。 – Nishant 2014-09-06 07:34:28

+0

@Nishant,因此它似乎明白,A和B是別名,因爲它們作爲值具有相同的地址;也* A和* B是別名,因爲他們是去相同的地址... – xdevel2000 2014-09-06 07:42:59

0

我回答的部分「我不確定是因爲* 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。希望這可以幫助。

-1

別名意味着共享相同的內存位置 int x = 50; int & y = x;

現在x和y共享相同的內存位置。 * ptr是指針變量並指向其他變量。

+4

-1。 C不是C++。 – 2014-09-06 07:20:59

相關問題