如果我們對一個(gè)非字符的指針進(jìn)行操作,方法是這樣的:
定義:
(1)int a=7; int *p=&a; 或者
(2)int a=7; int *p; p=&a; 或者
(3)int a=7; int *p; *p=a;
?。?)這樣定義的原因是因為等號兩邊的類(lèi)型必須匹配,int *p=&a; 等號左邊定義的是一個(gè)指針,指針的內容是地址,所以等號右邊也應該是地址,&a就是取空間a的地址;
(2)int *p; p=&a; 為什么不是 *p=&a 而是 p=&a; 因為在定義的時(shí)候“*”只是說(shuō)明p是一個(gè)指針,而p也是一個(gè)變量,不過(guò)是儲存地址的一種特殊的變量,對于變量使用,我們都是直接使用它的名字,就好象,我們定義個(gè)常量 const a=7; 我們要調用它的時(shí)候直接使用a就可以了,并不需要帶上 const 修飾,這里也一樣,用指針變量時(shí)并不需要帶上“*”;
(3)而第三種情況中的 *p=a;中的“*”和第二種里面是不同的,這里的“*”是取內容符,與之相反的是取地址符“&”,分析一下,第三種情況中,等號左邊是*p表示對指針p取內容,它的內容指向內存中的某個(gè)已經(jīng)在開(kāi)始通過(guò) int *p; 定義好的空間里(比較確切一點(diǎn)的說(shuō)法是,p在定義的時(shí)候,其內容里的地址指向內存中某個(gè)未知的空白區域,即未占用,不受保護的內存空間),這個(gè)空間里存放的數據類(lèi)型是整型,所以等號的右邊也應該是整型才能匹配,所以是 *p=a; 這里的“*”和定義時(shí)候的是不同的,這一點(diǎn)很重要。
其實(shí)上面的都是些題外話(huà),我要說(shuō)的其實(shí)是關(guān)于指針的輸出的一些問(wèn)題。我們利用上面定義好的進(jìn)行輸出操作。
輸出指針的內容(即所指向空間的地址):cout<<p<<endl;
輸出指針所指的內容(即指針內容所描述地址空間中的內容):cout<<*p<<endl;
指針對于字符的處理卻有些特殊,和前面的非字符的指針輸出處理要分開(kāi)理解。
比如,我們定義一個(gè) char a='A'; char *p=&a; 如果我們調用上面非字符指針的輸出方式,結果如下:
方式1 cout<<p<<endl; 結果 A####(#表示亂碼,不可識別) 并不是地址
方式2 cout<<*p<<endl; 結果 A 這和非字符的指針情況一樣,輸出指針指向的內容
而且我們直接操作 cout<<&a<<endl; 結果和方式1的結果是完全相同的
為什么方式1輸出的不是地址呢?這里有一個(gè)特殊的處理,雖然這里的p的內容確確實(shí)實(shí)是一個(gè)地址,但是cout操作字符指針的話(huà),它遇到地址,就會(huì )直接去尋找這個(gè)地址所指向的內容,并把它的空間里的機器數按照字符的規則轉化成字符輸出,直到遇到“\0”這個(gè)操作符才停止。所以我們直接輸出p的時(shí)候,它先輸出‘A’然后再繼續讀取后面的內存空間知道遇到“\0”,顯示結果是“A+亂碼”。
你肯定會(huì )說(shuō),為什么要這樣呢,這樣多不方便呀,其實(shí)這么做是有目的的,而且恰恰就是為了方便才這么設置的。因為這樣就可以很容易的處理字符串了,而處理字符串是我們在計算機中用得很多的操作。
比如我們第一個(gè)字符串數組 char a[]="mantou"; a[]在內存中在7個(gè)字節,而不是6個(gè),因為在mantou字符串后面還隱藏有一個(gè)“\0”,這時(shí)我們用 char *p=a;?。ㄟ@里不用&a是因為,a[]是一個(gè)數組,數組名a本身就是一個(gè)指針常量) 輸出操作 cout<<p<<endl; 這里就不會(huì )輸出地址,而是直接輸出整個(gè)mantou字符串,很方便哈,如果我們 cout<<*p<<endl; 結果顯示的是m,因為p是指向數組的首元素的地址的,就是指向這里的儲存m的空間的地址,所以取p的內容(*p),只能輸出一個(gè)m哦。
雖然通常情況下我們是不需要了解我們的數據地址的,但我也順便說(shuō)說(shuō),怎么得到字符指針的地址,也可以方便大家對內存地址的分配再做更深入的研究。
char a='A'; 如果這里直接輸出 cout<<&a<<endl; 當然是不能輸出地址的,原理上面已經(jīng)說(shuō)過(guò)了,cout遇到字符型地址就會(huì )轉換成字符串輸出。我們可以用指針p先取得a的地址(char *p=&a;),但是這樣用 cout<<p<<endl;也并不能得到地址呀,原因上面也說(shuō)過(guò)了。
做個(gè)小技巧,首先我們知道p中的內容本身就是地址,但是因為它是字符串,我們又不能直接輸出它,所以呀,我們可以把指針里的內容(記載的是一個(gè)地址數據)強制轉化成整型再輸出 cout<<(int)p<<endl; 呵呵,這樣就得到了這個(gè)指針里的內容——十進(jìn)制型的地址,而我們知道,地址是用十六進(jìn)制表示的,形式是 0x######## 0x后面加8位十六進(jìn)制數,我們把我們先得到的十進(jìn)制地址按照地址的表示形式用流操作轉化成十六進(jìn)制就可以了。代碼如下:
cout<<endl<<"0x"
<<setw(8)<<setiosflags(ios::right)<<setfill('0')
<<setiosflags(ios::uppercase)<<hex<<(int)p<<endl;
注意不要忘了 #include<iomanip.h> 這個(gè)頭文件哦
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。