1樓:匿名使用者
為了說清楚什麼是指標,必須弄清楚資料在記憶體中是如何儲存的,又是如何讀取的。
如果在程式中定義了乙個變數,在編譯時就給這個變數分配記憶體單元。系統根據程式中定義的變數型別,分配一定長度的空間。例如,c++編譯系統一般為整型變數分配4個位元組,為單精度浮點型變數分配4個位元組,為字元型變數分配1個位元組。
記憶體區的每乙個位元組有乙個編號,這圖中就是「位址」。
請務必弄清楚乙個記憶體單元的位址與記憶體單元的內容這兩個概念的區別。在程式中一般是通過變數名來對記憶體單元進行訪問操作的。其實程式經過編譯以後已經將變數名轉換為變數的位址,對變數值的訪問都是通過位址進行的。
這種按變數位址訪問變數值的方式稱為直接訪問方式,或直接訪問方式。
還可以採用另一種稱為間接訪問(間接訪問)的方式。可以在程式中定義這樣一種特殊的變數,它是專門用來存放位址的。
圖6.2是直接訪問和間接訪問的示意圖。為了將數值3送到變數中,可以有兩種方法:
直接將數3送到整型變數i所標識的單元中。見圖6.2(a)。
將3送到指標變數i_pointer所指向的單元(這就是變數i所標識的單元)中。見圖(b)。
所謂指向,就是通過位址來體現的。
由於通過位址能找到所需的變數單元,因此可以說,位址指向該變數單元。因此將位址形象化地稱為「指標」,乙個變數的位址稱為該變數的指標。
2樓:匿名使用者
int n = 10;
int *p = &n; //不管是c還是c++這句都是對的
int *p = n; //不管是c還是c++這句都是錯的!!!型別不匹配
在不同的地方*表示的含意是有區別的。
當*出現在型別定義時(型別之後的地方),如int *p;那這是告訴編譯器變數p的型別為int型別的指標(int*),所以你還可以這樣寫int* p;或int * p;都是可以的。
而直接出現在變數後(不是定義時),就表示解引用.
int *p;
p = &n;
是先定義p為乙個int型的指標,然後讓p等於(指向)整型n的位址
而int *p = &n; 變數p實際上是在定義的同時賦了初值,因此這裡p前面的*是要和型別(也就是int)合起來看,表示p是乙個int型的指標!此時,千萬不要把*和p一起來看!
所以int* p; //我有意把*寫得和int靠攏一些:),強調int*是一種型別
p = &n;
和int* p = &n;
是一回事
就好比:
int i;
i = n;
和int i = n;
是一回事
而*p = *p + 6;中p前面的*就是解引用符了
不要把概念搞混了啊,呵呵!
3樓:匿名使用者
你那個n是一種型別的物件,不是指標
而指標天生就是用來儲存位址的,
所以int *p = n是不合法的
4樓:匿名使用者
樓主只要記得把初始化和賦值分開就行了,沒有那麼複雜的。如果是在初始化,即int *p = ...中就應該跟乙個int *。你不要把它認為是賦值,而是設定p的初值。
不過c++確實在這裡很彆扭。事實上引用型宣告更彆扭,但是好象除了用其它特殊字元也沒有更好的辦法。:)
5樓:小玉是我老婆
為什麼?
不知道....
兩種形式而已.
乙個是先定義指標再賦值,另乙個是在定義指標的時候就初始化了.
c++類的指標定義
6樓:吉祥二進位制
c++中的類,本質上就是使用者自定義的乙個資料型別,因此它和內建資料型別在使用上有很多相似之處。 可以對比內建資料型別來理解。假設有乙個test的class。
要定義類的指標,如下:
test o_o; //定義test類的物件 o_o
test *p = &o_o; //定義乙個類的指標,指向o_o
與int型別對比:
int o_o; //定義乙個int型別的物件o_o
int *p = &o_o; //定義乙個int型別的指標,指向o_o
實際上是類似的。 不同之處在於建構函式、析構函式那塊。
同樣也可以使用new進行動態分配 。
int *p = new int (2); //動態分配乙個int物件並初始化為2
類test的動態分配也類似:
test *po_o = new test; //動態分配乙個test物件,這裡呼叫的是預設建構函式。
7樓:匿名使用者
不是,同樣是new可是含義是不一樣的。
對於int *parray = new int;這個的含義是在系統的堆空間上分配為int,也就是4個位元組的空間給parray,這個時候parray裡所指的值是沒有含義的,如你所說沒有定義值。
但是對於intarray * parray = new intarray來說,會激發intarray的建構函式,是否有意義則取決於intarray的建構函式的內容了。
8樓:
我是當一樣來理解的。
應該寫成這樣吧:
intarray * parray = new intarray();//括號
int * parray = new int();
兩個都不止是申明,已經初始化了。
第一句是建立(例項化)了乙個intarrya的物件,指標parray指向它。
第二句是建立(分配了)了int型別的記憶體空間,指標parray指向那個空間。
兩個指標都已初始化了。
c++ 指標 指標變數的概念
9樓:屠舟貢振華
指標關鍵要形象化的理解
比如說我指向你
,指的是你所在的位置
但代表的是你這個人
故p只是乙個位址
*p才代表乙個值
p=(乙個十六進製制的數)
10樓:吉家隱靖琪
呵呵,要解決你問的這個問題其實很簡單,你只是混淆了*的兩個作用,為了讓你理解,我改變了一種說法讓你更容易理解,看下面的例子:
(1)int
*p;//用意在於定義乙個指標變數,int*可以說是個整體,它為p申請了乙個四個位元組的記憶體空間,此時*只是乙個指標運算子的作用;
(2)int
i=10,*p=&i;
cout<<*p《綜上可知:*有兩個作用,一是指標運算子,二是間接訪問運算子。
11樓:匿名使用者
int i=10,j=20,*p=&j;
這裡的*p是定義的int型指標,*是屬於int的,你把i=10,j=20,去掉不就是和int *p=&j一樣.
它的含義是p=&j;*不屬於p,屬於int,p的型別是int*
12樓:匿名使用者
int i=10,j=20,*p=&j; 把這條語句連起來看,這是乙個變數賦初值的過程.只有在給指標變數賦初值時才能這樣寫。
如果把他改成和(2)一樣的寫法,就是:
int i=10,j=20,*p;
p=&j;
p是乙個指向整型變數的指標,可以用乙個整型變數的位址給他賦值。
如果非要在後面的語句中用*p,也是可以的,比如:
*p=10;//這句話是給p指向的那個整型變數賦值,也就是說結果是;j=10;
13樓:匿名使用者
因為開始時候是在定義乙個指標指向j
關於c++指標的含義?
14樓:
在c++中,定義指標變數如你上面所述可以寫成 int *a1。
此時的a1為乙個指標變數,其中可以存放乙個int型別的變數的位址,也即所謂的a1即指向對應變數的指標。但是,定義以外的地方,例如程式中用到a1時寫成你上面寫的那個樣子*a1 ,其表示取a1所指向的位址中存放的內容;也就是說定義int *a1,此時a1本身就是乙個指標了。後面如果用其指標直接用a1,如果要取a1所指向的位址中的內容,要用*a1;
後面的a1 = 3這樣賦值是不對的,因為對於指標變數是不可以使用常數對其賦值的;
當然,雖然*a1相當於乙個變數,但是如果給*a1賦值,如你上面的形式還是有問題的(雖然編譯環境可能不提示);因為這裡你只是定義了乙個整型變數的指標,還沒有對其賦值(沒有讓其指向已經存在的變數的位址),也就是說a1到底指向那乙個位址還不一定,是隨機的。這時改變其指向的位址中內容,就好像乙個定時炸彈,可能會改變系統某個引數從而報錯,當然也可能指向一般的空間而不報錯誤;
可以這樣:
int *a1 = new int;
*a1 = 3;
相當於定義了乙個int型指標,並且讓其指向新分配的int型的記憶體位址;然後將3值賦值給對應的已分配的位址中;
這樣解釋是不是說明白了呢?呵呵,希望對你有幫助!!
15樓:龔煒林
int *a1,a1=3;這樣不對的,因為a1是指標,是乙個位址,其次這是一句(乙個;),這句是定義,你同時定義乙個名稱的變數,不行。可以改為int a1=3;
16樓:匿名使用者
指標沒有分配記憶體空間是不能用立即數對其賦值的
你可以這樣初始化為3
int* a1 = new int(3);
17樓:lizhen振
a1是變數
*a1是指標即位址
18樓:
需要明確的是,你用了兩個a1,命名衝突,你先命名了乙個a1指標,又命名了乙個a1變數,直接不允許。
首先是個不允許的情況,這個前提下你討論他到底是什麼,沒意義。
如果你把改成int *a1,a2 = 3;後邊的問題我就可以回答了
a1是乙個位址,*a1是乙個變數,但是*a1 = 3;在本例中是不允許的。不是給變數賦值這麼簡單。
因為你的a1沒有初始化,只是宣告了一下,如果你加一句a1 = &a2;情況就不同了,a1有定義了,是指向a2的指標,此時*a1是a2的值,也就是3,此時寫一句*a1 = 33;這就相當於把a2改成33了,要注意a1和a2是兩個層次,a1存放a2的位址,*a1的數值和a2一樣。
如果你想直接int *a1 = 3;這也是錯的,在此句中int * 說明a1是指標型別,但是賦值語句中他是作為a1存在的,不是*a1,這是很重要的基礎。記住,此句的分解是:(int *) a1 = 3;因此,
a1需要的是乙個位址,3是乙個數值,這不同於a1 = 3,a1 = 3的大概意思是讓a1強行指向記憶體位址3(先不討論可行性),而int *a1; *a1 = 3;主要是3是乙個常量表示式,是乙個右值rvalue,如果指標是看門的管理員,右值你就當他是個臨時的房客,臨時的房客是沒有房間號的,有可能進旅店逛一圈連房都沒開就走了(其實,在休息室待了一下),他不可靠。你需要找乙個穩定住戶a2,來獲取相關位址,因為a2宣告過了,開過房了
c++中二維陣列的指標如何定義?
19樓:匿名使用者
二維陣列的指標就是指標的指標,比如乙個int型二維陣列:int array[2][3];
指向它的指標就可以定義成:int **p;
如何使用這個指標呢,就和使用普通二維陣列一樣,比如第一行第二個元素:p[0][1]
c 類的指標定義,c 指標型別
intn 10 int p n 不管是c還是c 這句都是對的。int p n 不管是c還是c 這句都是錯的!型別不匹配。在不同的地方 表示的含意是有區別的。當 出現在型別定義時 型別之後的地方 如int p 那這是告訴編譯器變數p的型別為int型別的指標 int 所以你還可以這樣寫int p 或in...
c 類的指標定義,c 類物件和指標的區別
吉祥二進位制 c 中的類,本質上就是使用者自定義的一個資料型別,因此它和內建資料型別在使用上有很多相似之處。可以對比內建資料型別來理解。假設有一個test的class。要定義類的指標,如下 test o o 定義test類的物件 o o test p o o 定義一個類的指標,指向o o 與int型...
c若定義類,C若定義類AclassApublicAAintx
a a 4 這一定義,呼叫類a的賦值建構函式a int x 一次 a b 3 相當於定義了型別為a物件的陣列回,其元素個數答為3,即呼叫三次類a的預設建構函式a a p 2 定義了乙個型別為a 的陣列,即指向a類物件的指標陣列,並未產生類a的物件,不呼叫建構函式 滿意請採納。a a 4 呼叫有參建構...