1樓:徐小維
不太清楚樓主具體指什麼語言,就C語言而言,指標變數是乙個位寬通常等同於體系結構位寬的記憶體單元,對於這樣乙個變數的賦值操作當然是完全合法的。
int *p = (int *)654321;
就像這樣,這個操作會在存放p這個指標變數的記憶體空間處寫上了654321,這不會有什麼問題,就像你給乙個變數賦值一樣,不管這個待賦值是多少,賦值操作本身都不會有問題。
唯一可能帶來問題的是對這樣乙個指標的解引用操作,例如
*p = 1;
因為654321這個位址你不知道是不是一塊合法的位址,而往654321這個位址上寫數可能會導致程式錯誤,或者直接segment fault,具體情況就要看這個位址本身了。
既然指標不能隨意賦值,那C語言為什麼還要保留這樣的特性呢?這是因為在很多硬體相關的場合,需要直接操作某個特定值的位址空間(例如乙個給定位址的暫存器),這個時候給指標賦值然後操作它就變得很有用,不過這樣的操作通常不會發生在使用者態的應用程式中。
2樓:玲瓏邪僧
我估計題主想問的是直接賦值的方式吧。
一種是將指標指向已被賦值的記憶體(也就是將該記憶體位址賦值給它);右值為字串的情況下還有另一種方法,可以用strcpy函式進行賦值,此時一方指標僅僅只進行過宣告(也就是題主指的原始指標變數),必須得用malloc(不會初始化記憶體)或者calloc(會初始化記憶體)函式給指標動態分配記憶體空間,否則會報錯。
3樓:Xenophon Tony
賦值前注意強制轉換格式就好了,位址不是拿來亂用的。
int *ptr;
ptr = 0x111111 必然是錯誤的只有在強制轉換右值為指標所宣告型別後才能賦值,如ptr = (int *)0x111111
如果是char *ptr,賦值的時候注意用ptr = (char *)0x111111就好了。
同理,在進行動態記憶體分配的時候,如果double *ptr,也必須用ptr = (double *)malloc(100)。
4樓:
1 int main
2 你們把它定義成指標型別卻賦給它整型是什麼心態。。。
5樓:chelalv
在C語言了,是不可以直接賦值的,比如int*a;a
=0x123456
;編譯不過的,等號左邊是指標變數,右邊是整型變數,但是可以賦值NULL,也就是空指標;a
=NULL;
在C 中,定義變數時直接初始化與先定義,後賦值在時間複雜度上有區別嗎?
Ivony 1 對於編譯器而言,在同乙個作用域中變數宣告位置對編譯結果沒有影響,變數只要在使用前被宣告即可。2 這個問題和時間複雜度一毛錢關係都沒有。 alphonsez 如果是簡單型別,比如int等,那麼定義的時候沒有初始值,那麼只是在stack上分配空間,並沒有額外初始化動作。然後再賦值就會把值...
對int變數賦值的操作是原子的嗎?
歐文韜 顯然不是,不然要那麼多原子操作的函式幹嘛用?拋開CPU操作順序不說 估計你只問賦值操作就是可以容忍值互相覆蓋 還有CPU的1234級快取吶,不加記憶體屏障的話也有可能乙個核賦值以後,另乙個核沒看見吶。 童話式狂躁者 當然不是,所有平台都不是,你可以這麼認為,多說無益。不要依賴平台實現。進一步...
找乙個檔案可以直接通過指標來找嗎?
王旭競 1 本身檔案系統就是通過指標實現的。哪個資料結構離得開指標的。2 如果是指像記憶體一樣,僅通過位移來確定檔案位置,這是不可能的。檔案目錄結構需要動態變化,必須至少是乙個樹結構。3 海量檔案的話,不要放在乙個資料夾裡。 在檔案系統當中檔案 檔名 本身就是以一種資料結構進行組織,在查詢的時候是將...