如何理解char型指標與int型指標的不同表現

2021-07-09 04:29:58 字數 2032 閱讀 8423

這裡是按照我的想法來猜測語言設計時的一些特性,如果有高人能進一步指點,不勝感激~

其實一直對字串陣列與字串指標都抱有很多疑問,因為它用起來和整型指標相比完全不是乙個風格。

比如char *str =」char test」;可以這樣直接賦值

而整型int *a = 卻完全不合理

我們可以很容易的理解int型指標,a就是指標是乙個位址,&a就是指向的資料。然而str就是字串」char test」,我們卻取不到str的位址,&str卻只能取到第乙個字元。

所以到底怎麼去理解char *與int*同為陣列卻不同的表現?

**陣列指標與多維陣列(附:為什麼指標加一,位址不一定加一)

根據這個部落格我們得出乙個結論,邏輯記憶體中,每個位元組對應乙個位址,也就是每個字元對應乙個位址,乙個int型的變數由於是4個位元組,就會對應4個位址。我們只有取到整型的首位址才能得到完整的int型資料。(如圖m[0]就是int型的首位址,如果這時m[0]指向的是乙個char,那麼這個字元就是ascii表 00000000 對應的字元)

這樣,其實我們也應該可以理解,為什麼int型的指標可以取到乙個形如0x257gvb29這樣的位址,而char型的指標卻能取到乙個字元?

因為對於乙個char的位址,我們就可以或得對應的字元是什麼,所以語言在設計的時候就讓其顯示出這個字元(這只是簡單的猜測,可能會有更深一步的原因),而對於int的位址,我們只能知道這個int型資料第乙個位元組的內容,這個位元組的資料可以說對我們沒什麼太大的意義,所以我們還是按照指標的方式來記錄這個位元組,這樣比較容易去理解指標的意義。最後,再強調一遍,char*是乙個指標!即使你列印出來的是乙個字串!

(補充:我們看到乙個int型對應4個位元組,那麼我們能不能只取到最後乙個位元組或者最後兩個位元組的資料?回答是可以的

比如我們定義了乙個int btest = 0x123456;      通過(byte*)   和    (word*)強轉再解引用即可

#include #define mem_b(x) (*((byte*)(x)))

#define mem_w(x) (*((word*)(x)))

int btest = 0x123456;

int m = mem_b((&btest));/*m=0x56*/

int n = mem_w((&btest));/*n=0x3456*/

給指標賦值就是讓其指向乙個位址。對於char *str = 「abc」;本質是在記憶體常量區生成乙個區域存放"abc"字元,而且這個區域是不可以修改的,不受使用者控制,而str就是指向的這個位址,所以相當於const char *str,無法修改這個位址的變數。為什麼str在列印的時候就變成了「char test」?這可以理解為是語言層面的處理。

char* cstr = "123";//從常量區分配乙個空間

char* cstr1 = "123";

//cstr[0] = 'e';//會觸發異常,因為cstr指向的是常量區的位址,不允許修改

//char cstr = "123";//這種情況是從棧區分配乙個空間

cout << "列印字串:" << endl;

cout << cstr我們進一步看,str指向的是乙個字串,所以給其賦值乙個字串是合理的,而且這些字串中的字元都是連續的。而對於int型的指標,指向的是乙個數,如果直接把好幾個數賦值給指標,那麼指標指向的應該是誰?如果你想說可以指向一堆連續存放的數,那麼我告訴你,這個交給陣列就可以了。你可以先宣告乙個陣列,然後把陣列的首位址給int*指標,這樣就實現了讓指標指向乙個陣列。

當然,c++在新標準中支援了{}賦值初始化,這樣的賦值int a = {};是可行的

,但是int型指標還是不支援的,這樣設計也可能是為了避免混淆指標與陣列。

關於字串的更多理解與案例可以參考:

c語言---關於scanf讀入字串的一些問題

int強制轉char型問題理解

include int main 結果輸出是 000000f7 和fffffff7 16進製制的0xfffffff7轉化為2進製是 1111,1111,1111,1111,1111 1111 1111 0111 unsigned char i unsigned char a int型強制轉化成cha...

char 型陣列Int型互轉

include include typedefunsignedcharuchar typedefunsignedintuint 轉換函式 temp 字元型陣列 pout int型陣列 length 字元型陣列的長度 這裡假設字元型陣列裡包含的都是偶數個元素 如果是奇數個數,則需要增加如下處理 檢查l...

字元型(char)如何轉成整數型(int)

我是乙個新手,這也是我第一次寫部落格,相信很多人應該和我一樣,在剛開始接觸c語言的時候,不知道應該怎麼辦,但是學習的方法就是不停的看書,然後每天都寫一下 不一定要寫得多,哪怕寫乙個程式也可以,最起碼要保持對 的敏感度。當我們在acm上寫題的時候,經常會碰到輸入一串數字,然後對這串數字進行相應的操作,...