2010-05-01 82 views
0

考慮下面的2個聲明。聲明指針變量的不同類型

*旁邊顯示的數據類型和不相鄰的可變

char* ptr1, * ptr2, * ptr3; //all 3 are pointers 

*旁邊顯示變量和不相鄰的數據類型

char *ptr1,*ptr2,*ptr3; //again all 3 are pointers 

是否有2點聲明之間在旅遊解說的任何差異。我知道變量沒有區別。

介紹void指針的基本原理是什麼?

回答

5

唯一的區別是空白,他們最終成爲指向字符的指針。我個人使用char * ptr1,在我的代碼中使用了大量的空白。

無效指針可以指向任何類型的對象並且沒有大小。例如,這個工作(但不是一個真正的好主意):

int * ptr1; 
float * ptr2; 
(*ptr1) = 17; 
ptr2 = (void*)ptr1; 

(*ptr2)現在將解釋PTR1的字節作爲一個浮動,而不是一個int,給你一個不同的結果。您可以在類型之間切換。在指針函數typedef中也有一些用於void*的用法。

此外,如果您有char * ptr1和做ptr1++,您將遞增地址ptr1指由sizeof(char)。這是不可能的void *,它會給你一個編譯器錯誤,說它不知道增加的大小。

1

空指針指向某種未知的數據,他們可以轉換爲任何類型的,因此不是類型安全的,他們可能會崩潰您的程序,使用升壓::如果任何有需要的總變異。
聲明之間沒有區別。

1
  1. 唯一的區別在於空白不相關。 *不會「出現在數據類型旁邊」或「在變量旁邊」 - 您甚至可以編寫char*a,*b;。重要的是優先權。 *綁定到右側,所以到變量名稱。這也意味着,char* a, b;相當於char (*a), b;,並會導致一個字符指針a和炭b,而不是兩個指針。如果你想兩個指針,你需要使用char *a, *b;,因爲在你的榜樣。
  2. void指針是指向內存的指針,沒有指定類型。編寫一個應該接受各種類型數據的函數時,這非常有用。例如,c庫函數memcpy()可以複製任意數據。它不關心它傳遞的數據。正如您不知道什麼數據會獲得通過實施,您需要使用void*對於該功能時,否則您將需要一個memcpy()功能爲每個數據類型(組合),你可以通過。由於這是一個c庫函數,並且c不支持函數重載,因此需要使用不同名稱的很多函數。
1

void指針表示沒有數據類型,因此可以用來指向任何類型的數據。但是,由於數據類型是未知的,因此無法直接引用指針。爲此,需要事先將指針轉換爲某種數據類型。

無效指針適用的情況: 有時,爲了使函數接受不同類型的數據,例如, int,char,double等,可以使用模板。 (雖然重載函數是一個選項,但效率最低的方法)。爲此目的的另一種方法是使用void指針。

空隙使用functionName(void *的數據,類型PARAM) { /*基於所述第二參數PARAM,解除引用這樣的指針數據 的數據能夠以期望的方式來處理。 * /}

就在提醒:因爲他們確實有使用和功能的不同目的 空指針和空指針應加以區分。後者具有指針類型,但不指向任何有效的任何數據地址。

0

我聽到一個笑話,說如果你問一個C++程序員,他們會告訴你把它放在左邊,而右邊是一個C程序員。

最終,由於*綁定到變量,而不是類型名稱,所以將它放在讓代碼更清晰的權利上無疑是個好主意。但是,由於在C++中沒有理由處理原始指針,所以我從來沒有遇到過問題。

+1

「毫無疑問」?所以你說C++程序員做了一些「無疑」錯誤的事情? 有些人把它放在左邊的原因是它更直觀。它是類型規範的一部分。你正在創建一個int指針,而不是一個int。根據你的觀點,任何一個選項都是最明顯的選擇。 – jalf 2010-05-01 19:56:04

+1

「毫無疑問」!=重要。我總是親自把它放在左邊,儘管最好不要這樣說,這是最後聲明的要點。 – Puppy 2010-05-02 12:29:08