2010-06-11 56 views
0

好吧,我在這裏看一個代碼,這個想法很難理解。關於指針和內存地址的困惑

#include <iostream> 
using namespace std; 
class Point 
{ 
public : 
    int X,Y; 
    Point() : X(0), Y(0) {} 
}; 

void MoveUp (Point * p) 
{ 
    p -> Y += 5; 
} 

int main() 
{ 
    Point point; 
    MoveUp(&point); 
    cout << point.X << point.Y; 
    return 0; 
} 

好了,所以我認爲,一類是創建和X和Y宣佈,它們被放置在構造函數中

創建方法和參數是點* P,這意味着我們將要把構造函數的指針粘貼在函數內部;

現在我們創建一個名爲point的對象,然後調用我們的方法並將指針地址放在裏面?

是不是指針地址只是一個內存號碼像0x255255?

爲什麼沒有聲明?

(int * p = Y) 

什麼是內存地址?它可以用作參數?

+11

確保您的計算機位於水平面上。您的所有代碼似乎已經滑到了屏幕的左側。 – 2010-06-11 17:06:09

+1

是啊我知道,我住在加利福尼亞你期望什麼? – TimothyTech 2010-06-11 17:15:13

+0

對於它的價值,更喜歡對指針的引用。引用是別名,大多數時候你想要別名變量,而不是指向它。你的函數是void void MoveUp(Point&p){p.Y + = 5; }',你把它稱爲'MoveUp(point);';現在'p'別名'point'。用你的代碼,考慮'MoveUp(0);'發生了什麼。 – GManNickG 2010-06-11 17:27:46

回答

9

p被宣佈聲明。

void MoveUp (Point * p) 
{ 
    p -> Y += 5; 
} 

是,將採取一個指向Point並加入5到其Y值的函數。這是下面的沒有什麼不同:

void f(int n) { 
    printf ("%d\n", n); 
} 
: 
int x = 7; 
f(x); 

n並沒有在這種情況下定義,你不會說。你的情況與p一樣。

也許在代碼中的一些意見將幫助:

#include <iostream> 
using namespace std; 
class Point 
{ 

public : 
    int X,Y; 
    Point() : X(0), Y(0) {}  // Constructor sets X and Y to 0. 
}; 

void MoveUp (Point * p)   // Take a Point pointer p. 
{ 
    p -> Y += 5;     // Add 5 to its Y value. 
} 
int main() 
{ 
    Point point;     // Define a Point. 
    MoveUp(&point);    // Call MoveUp with its address. 
    cout <<point.X << point.Y; // Print out its values (0,5). 
    return 0; 
} 

指針就是間接的級別。在代碼中:

1 int X; 
2 int *pX = &X; 
3 X = 7; 
4 *pX = 7; 

第3行和第4行的效果是相同的。這是因爲pXX的指針,所以*pX,pX的內容實際上是X

對於您的情況,p->Y(*p).Y相同,或p指向的類的Y成員相同。

+0

那麼&point是什麼意思? C++是否接受地址並完全回收構造函數或類的實例? – TimothyTech 2010-06-11 17:13:46

+0

'&point'是指向'point'的指針(ISO沒有強制它是一個地址,但它通常是)。這裏混合了C和C++語義。一般來說,你會'p.MoveUp()'並讓它操作'this-> Y',而不是在老式的方式它在這裏完成。 – paxdiablo 2010-06-11 17:17:53

+0

&point =一個指向RAM的巨驢陣列的索引,您可以在其中找到Point的一個實例。當然,這並不是真正的指針工作方式,但是很容易以這種方式來思考它們。 – Puppy 2010-06-11 17:18:52

3

指針只是一個像其他任何變量一樣的變量,但它包含一個內存地址。
閱讀該行約6次。名字指針本身對人們來說似乎很可怕,但實際上這只是爲了讓自己更容易思考發生了什麼。

指針的類型(例如char *,int *,Point *)只是告訴編譯器存儲在該內存地址的內容。

所以所有的指針都是一樣的,因爲它們都存儲一個簡單的內存地址。但是它們的區別在於指針的類型會告訴你該內存地址中包含的內容。

爲什麼沒有聲明?

p被聲明:

//p is declared to be a variable that holds an address 
// and at that address it holds a type Point 
//p itself only holds an address not the actual data of the Point. 
void MoveUp (Point * p) 
{ 
    //The -> operator when applied to a pointer, means give me the object at 
    // that address and then access the following member 
    p->Y += 5; 
} 

什麼是存儲ADDRES是什麼呢?它可以用作參數?

你可以簡單地把一個存儲地址想象成一個數字。在32位程序上,這個數字是4個字節長。在64位程序中,這個數字是8個字節長。


考慮下面的代碼:

Point point; 
Point *p = &point; 

point變量是Point類型。它擁有類Point的一個對象。
&point表達式返回Point變量point的地址。表達式&point的類型是Point*
p變量保存類型爲Point的地址,p的類型爲Point*p在對象point的內存中保存地址。

1

P在函數定義

void MoveUp (Point * p) 
1

在你看指針之前,你必須先澄清「class」,「instance」和「constructor」的含義。你的句子

,創建一類和X和Y 宣佈,他們正在把 構造

裏面顯示了這種澄清的必要。以下是關於您可能需要閱讀的書籍的討論:Books to refer for learning OOP through C++

1

將內存視爲連續的小塊。

現在,將Point類視爲2塊寬度的東西,然後將它放在內存中的任何位置。在哪裏並不重要,重要的是,它只能放在一個起點上。您可以移動它並更改該起始點,但不可撤銷地將從一個起點開始。

然後指針是那個ONE起始點的數量。

當你傳遞一個指針作爲參數,你在幹什麼

  • 你:「哎功能,拿這點和你知道什麼」
  • 功能:'好的,但是Point!在哪裏?'
  • 你:'哦,對不起,我不把它和我一起,它位於那裏,在那個街區!'

而函數會知道現在有一個Point,並且用編譯器的魔法,函數會知道它的2個block的寬度。然後函數接受它,改變它的Y(再次感謝,編譯器),並將它留在原來的位置(事實上,它甚至沒有把它從那裏拿走)。 幾分鐘後,你去那裏,看到Point.Y已經改變。你說'謝謝',然後你走了。

0

p被聲明爲方法參數。

指針是一種特殊的變量,它保存一個值的內存地址。 *符號是取消引用符號,它告訴您的代碼查找指針保存的內存地址中的值IN。現在也是介紹&符號的好時機,它會告訴您的代碼獲取值的內存地址。例如:

int i = 5; //int 
int *pointer; //int pointer 

pointer = &i; //sets pointer to the memory address of i 

doMath(&i); //passes a memory address, value inside that address is being used 
doMath(pointer); //same as above 
dontMath(i); //value of x will be 207, value of i is still 7 since a copy is being modified 

//value of pointer is a memory address 
//value of *pointer is the value stored inside that memory address, 7 
//value of &pointer is the memory address of pointer, which itself holds the memory address 


void doMath(int *p) { 
    *p++; 
} 
void dontMath(int x){ 
    x=x+200; 
} 

我早期的困惑是*符號的含義。在變量聲明中,這意味着你正在爲某個數據類型(一個包含內存地址的變量)聲明一個指針。在其他地方,它是解除引用符號,告訴您的代碼解決該值。