指標變數可以直接賦值嗎?

時間 2021-05-12 02:55:13

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 海量檔案的話,不要放在乙個資料夾裡。 在檔案系統當中檔案 檔名 本身就是以一種資料結構進行組織,在查詢的時候是將...