2010-11-16 48 views
1

這基本上只是爲了幫助我更好地理解指針,所以如果你們可以確認/否認/解釋任何事情,它看起來像我不明白我會最感激。使用郵箱,阿姨,街道和所有垃圾的例子只是令人困惑。C++指針和引用說明

int a = 5; 

int b = &a; // b will be the memory address of 'a' 

int *c = a; // c will be the value of 'a' which is 5 

int *d = &a; // d will be a pointer to the memory address of 'a' 

int &e = a; // what would this be? 


void FunctionA() 
{ 
    int a = 20; 
    FunctionB(&a); 
    // a is now 15? 
} 

void FunctionB(int *a) 
{ 
    a = 15; 
} 

謝謝大家的幫助,我只是試圖提高我的理解超越所有的蹩腳的比喻解釋即時閱讀。

+0

很好的答案在這裏:http://programmers.stackexchange.com/questions/17898/whats-a -nice-pointers for pointers – 2010-11-16 02:40:26

+0

您是否試圖編譯所有這些語句? – 2010-11-16 02:40:32

+0

把'e'想象成'a'的別名。任何時候讀取'e',都會返回'a'的值。任何時候你寫'e','a'都會更新。 – jalf 2010-11-16 02:55:34

回答

3

我帶的東西一一:

int b = &a; // b will be the memory address of 'a' 

號編譯器(可能)將不允許這樣做。您已經定義b是一個int,但&aint的地址,所以初始化將無法正常工作。

int *c = a; 

否 - 同樣的問題,但相反。您已經定義c是一個指向int,但你試圖用一個int的進行初始化。

int *d = &a; 

是 - 您已經定義d是一個指向一個int,而你分配一個int它的地址 - 這很好。的int(或int秒的陣列)的地址是什麼的指針int成立。

int &e = a; 

這定義e是一個int的引用,並對其進行初始化,以a參考。這是完全合法的,但可能不是很有用。僅供參考,引用的最常見用法是作爲函數參數(當然,當然還有其他目的)。

void FunctionA() { int a = 20; FunctionB(&a); } 
void FunctionB(int *a) { a = 15; } 

爲了使這項工作,你需要更改FunctionB分配:

void FunctionB(int *a) { *a = 15; } 

由於這是,你想一個int分配給一個指針,這是行不通的。您需要分配intint指針點改變調用函數的值。

+0

我在這個響應中看到了賦值和初始化之間的一些混淆。仍然+1 – Chubsdad 2010-11-16 02:55:30

1
int &e = a; // what would this be? 

e是對a的參考。在這種情況下,&字符不是'操作符的地址'。您將e視爲正常(而不是指針)變量,但ea的值將是相同的,無論您如何處理(只要兩者都保持在範圍內),因爲e實際上只是一個別名。

0

我想你的意思:

int *b = &a;,這使得稱爲B指針指向的值(B是一個指針,它是一個地址)

int c = *b;,(或者只是詮釋C = A,如果你只想C到擁有價值),在這種情況下,*取消引用指針b

FunctionA()見下文,那麼a將是15(要傳遞的a到FunctionB地址)

void FunctionB(int *a) {*a = 15;}將該值設置爲15(* dereferences)

0

int &e=a;是對「a」的引用。

,這些都是錯誤:


int b = &a; 
int *c = a; 
1

INT一個= 5;

到目前爲止好。

int b =&a; // b將是內存地址'a'

這實際上是一個編譯錯誤。你的意思可能是int *b=&a;b是一個指向整數的指針。 編輯:如果你指以數字形式來獲取地址,您需要強制強制轉換爲整數:int b=(int)&a;

INT * C = A; // c的值爲'a'即5

這個比較混亂。在它的核心,一個指針只是一個數字,當然,但是這種類型的分配本質上並不安全(正如你所看到的,你將5分配給一個指針,並試圖解引用它很可能會導致程序崩潰)。如果你真的想c指向內存位置5,你必須明確地告訴編譯器,你知道你在做什麼:int *c=(int *)a

int * d =&a; // d將是指向內存地址'a'的指針

這是正確的,與第二個可能的含義相同。

INT & E = A; //這是什麼?

e是對a的「參考」。基本上,在內部它只是一個指針a,但您不必手動取消對它的引用,編譯器爲您代勞。

void FunctionA(){int a = 20; FunctionB(& a); // a現在是15? }

是的。

void FunctionB(int * a){a = 15; }

...假設您將其寫爲*a=15;。你重寫值由a,而不是指針本身指向。

你對這個總體看起來很困惑,我推薦閱讀「Thinking in C++」一書,它寫得很好!

+0

爲什麼int b =&a是編譯錯誤? – akonsu 2010-11-16 02:47:00

+1

親自試一試:http://ideone.com/L6KjU。基本上,編譯器不會將指針轉換爲非指針(反之亦然),而無需明確地告訴它。這是C和C++之間的主要區別之一。 – Blindy 2010-11-16 02:52:35

+0

@akonsu:一個int。 &a是一個int的地址。 b是一個int。 b不能被初始化爲一個地址(反正沒有投射);這是一個整數。要保存一個int的地址,你必須使用一個「int指針」,其語法爲「int *」。所以「int * b =&a」很好,因爲這裏b是一個指向int的地址的指針,而不僅僅是一個int。 – Zeke 2010-11-16 02:55:30

1

你有很多好的答案在這裏爲您具體的例子,所以我想與大家分享,我用來學習如何指針工作的時候,我開始了一個通用的技術。

獲取方格紙的大板和縱向躺在它在你面前的桌子上。這是你電腦的記憶。每個方框代表一個字節。選擇一行,並將數字'100'放在最左邊的方框下方。這是內存的「最低地址」。 (我選擇了100作爲不是0的任意數字,您可以選擇另一個數字。)按從左到右的升序對盒子進行編號。

 
+---+---+---+---+---+-- 
| | | | | | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 

現在,就目前而言,假設一個int是一個字節的大小。你是一個八位電腦。將您的int a寫入其中一個框中。箱子下面的數字是它的地址。現在選擇另一個框包含int *b = &aint *b也是一個存儲在某個地方的變量,它是一個包含&a的指針,它發音爲「a的地址」。

int a = 5; 
int *b = &a; 
 
    a  b 
+---+---+---+---+---+-- 
| 5 | |100| | | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ... 

我們通過視覺,你看到的價值觀和指針的任何其他組合工作,你可以使用這個模型。這是一個簡化(因爲語言的書呆子會說,一個指針不一定的地址,內存是不是一定順序,並有堆和棧和寄存器等),但它是一個相當不錯的類比99%的電腦和微控制器。

可擴展模型,真正的四字節int太...

int a = 5; 
char b = 2; 
 
    a a a a b 
+---+---+---+---+---+-- 
| 0 | 0 | 0 | 5 | 2 | ... 
+---+---+---+---+---+-- 
100 101 102 103 104 ...