|
藍森林 http://www.lslnet.com 2006年6月6日 10:18
C語言中指針的15個問題
C語言中指針的15個問題
aqiaoboy
1 指針的四要素
1指針變量,表示一個內存地址,通常為邏輯地址,與實際的物理地址還有一個映射關係。
2指針變量的長度,在WIN32下為四個字節,
3指針指向的變量
該內存地址空間下存放的變量,具體內容可能是各種類型的變量。
4 指針指向的變量的長度,以該內存地址空間開始的內存空間大小。
2 Const,volatile修飾指針的含義
const char *cpch=」hello』;
表示指針指向的變量不可改變,但指針本身是可以改變的
char * const pchc;
指針指向的變量可以改變,但指針本身不可改變。
Const char * const pchc;
兩者都不可變。
3 堆和棧上的指針
指針所指向的這塊內存是在哪裡分配的,在堆上稱為堆上的指針,在棧上為棧上的指針。
在堆上的指針,可以保存在全局數據結構中,供不同函數使用訪問同一塊內存。
在棧上的指針,在函數退出後,該內存即不可訪問。
4 什麼是指針的釋放?
具體來說包括兩個概念。
1 釋放該指針指向的內存,只有堆上的內存才需要我們手工釋放,棧上不需要。
2 將該指針重定向為NULL。
5 near,far型指針的區別?
老式的IBM PC兼容機才有這種區別,因為老式機不能完全支持32位指針,
所以才分為16位指針,(near),和32位指針(far)
從386開始沒有這種區別,都是32位指針。
6 數據結構中的指針?
其實就是指向一塊內存的地址,通過指針傳遞,可實現複雜的內存訪問。
7 函數指針?
指向一塊函數的入口地址。
8 指針作為函數的參數?
比如指向一個複雜數據結構的指針作為函數變量
這種方法避免整個複雜數據類型內存的壓棧出棧操作,提高效率。
注意:指針本身不可變,但指針指向的數據結構可以改變。
9 指向指針的指針?
指針指向的變量是一個指針,即具體內容為一個指針的值,是一個地址。
此時指針指向的變量長度也是4位。
10 指針與地址的區別?
區別:
1指針意味著已經有一個指針變量存在,他的值是一個地址,指針變量本身也存放在一個長度為四個字節的地址當中,而地址概念本身並不代表有任何變量存在。
2 指針的值,如果沒有限制,通常是可以變化的,也可以指向另外一個地址。
地址表示內存空間的一個位置點,他是用來賦給指針的,地址本身是沒有大小概念,指針指向變量的大小,取決於地址後面存放的變量類型。
11 指針與數組名的關係?
其值都是一個地址,但前者是可以移動的,後者是不可變的。
12 怎樣防止指針的越界使用問題?
必須讓指針指向一個有效的內存地址,
1 防止數組越界
2 防止向一塊內存中拷貝過多的內容
3 防止使用空指針
4 防止改變const修改的指針
5 防止改變指向靜態存儲區的內容
6 防止兩次釋放一個指針
7 防止使用野指針。
13 指針的類型轉換?
指針轉換通常是指針類型和void * 類型之前進行強制轉換,從而與期望或返回void指針的函數進行正確的交接。
14 什麼是指針退化?
如果用一個數組作為函數入參
比如
void fun(char a[100])
{
cout<<sizeof(a)<<endl; //四字節而不是100字節
}
15 指針的移動問題?
指針P ++具體移動的字節數等於指針指向的變量類型大小。 |
C語言中指針的15個問題
寫得還比較全的
函數參數我都用指針沒有用數組
14 什麼是指針退化?
如果用一個數組作為函數入參
比如
void fun(char a[100])
{
cout<<sizeof(a)<<endl; //四字節而不是100字節
}
像這樣定義也不能保證檢查傳進來的參數對不對
[code]
int a(char s[100])
{
s[100]=1;
return 0;
}
main()
{
char s[20]="hello";
a(s);
}
[/code]
編譯時使用dev-c++沒有問題 |
| |