為什麼一般不用一個整數給一個指標變數賦初值?[c/c++]
-----------摘自《c和指標》6.9指標常量----------------------------------------------------------------------------------------------------------------------------------
假定變數a儲存於位置100,下面這條語句的作用是什麼?
*100 =25;
它看上去像是把25賦值給a,因為a是位置100所儲存的變數。但是,這是錯誤的,因為字面值100的型別是整型,而間接訪問操作只能作用於指標型別表示式。
如果你確實想把25儲存於位置100,你必須使用強制型別轉換。
*(int*)100 = 25;
強制型別轉換把值100從“整型”轉換為“指向整型的指標”,這樣對它進行間接訪問就是合法的。如果a儲存於位置100,那麼這條語句就把值25儲存於a。
但是你需要這種技巧的機會是絕無僅有的。
你通常無法預測編譯器會把某個特定的變數放在記憶體中的什麼位置,所以你無法預先知道它的地址。用&操作符得到變數的地址是很容易的,但表示式在程式執行時才會進行求值,此時已經來不及把它的結果作為字面值常量複製到原始碼。
這個技巧唯一有用之處是你偶爾需要通過地址訪問記憶體中某個特定的位置,它並不是用於訪問某個變數,而是訪問硬體本身。例如,作業系統需要與輸入輸出裝置控制器通訊,啟動I/O操作並從前面的操作中獲得結果。在有些機器上,與裝置控制器的通訊是通過在某個特定記憶體地址讀取和寫入值來實現的。但是,與其說這些操作訪問的是記憶體,還不如說它們訪問的是裝置控制器介面。這樣,這些位置必須通過它們的地址訪問,此時這些地址是預先已知的。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
可以把指標的值當做一個整數取出來,也可以把一個整數值當作地址賦給一個指標。
int a=123,b; int *ptr=&a; char *str; b=(int)ptr; //把指標ptr的值當作一個整數取出來。 str=(char*)b; //把這個整數的值當作一個地址賦給指標str。
注意:
例如:
unsigned int a;
a=N; //N必須代表一個合法的地址
ptr=a;
上面強調了a的值必須代表一個合法的地址,否則的話,你在使用ptr的時候,就會出現非法操作錯誤。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ps:一般不用一個整數給一個指標變數賦初值,但是可以用。(絕無僅有)
當向指標變數賦值時,賦的值必須是地址常量或變數,不能是普通整數。
執行如下程式碼:
int *pi = (int*)0xbfc5aaac;
一般情況下,會報“段錯誤”,因為這個地址可能沒有對映到實體記憶體;
因此使用指標要特別小心,很容易將指標指向錯誤的地址,訪問這樣的地址可能導致段錯誤,可能讀到無意義的值為什麼一般不用一個整數給一個指標變數賦初值?
應該是為了安全和相容的問題。您將整數賦值給指標變數,就是賦給這個變數一個絕對地址。
您能確保您使用這個絕對地址時:
(1)您是否保證沒有訪問系統禁止您訪問的空間;
(2)假設(1)滿足,您能保證在任何計算機上訪問這個空間的效果都一樣?
如果這兩點都能保證,您確實可以直接賦值(其中包含了一個強者轉換的過程)。
不過,可能大多數情況下誰都沒這個把握哦,也許X86系統的系統中斷函式地址還20多年來始終維持不變?
- 任何一個指標變數本身資料值的型別都是unsigned long int
- 指標賦值運算常見的有以下幾種形式:
把一個變數的地址賦予一個指向相同資料型別的指標;
把一個指標的值賦予相同資料型別的另外一個指標;把陣列的地址賦予指向相同資料型別的指標。
部分內容摘自網際網路: