請教下,用char指標指向int型位址,為什麼會出現負數?
1樓:癯月笑浮生
這種問題不用想了,不同型別的指標相互指向根本就是不和規範的嚴重錯誤行為,位址可以以任何形式表現,畢竟是錯誤的,什麼都有可能。
2樓:樂觀的
假設int型變數佔4個位元組,同時假設在定義int型(取值範圍-2^31~2^31-1)變數studio時,系統給變數studio分配的位址空間編號依次為40,41,42,43,當給變數studio賦值128時,編號40的實際內容為「00000001(由低位到高位儲存)」,編號的內容均為「00000000」,其中編號43中的最後一位『0』是符號位,表示正數。
現在,又定義了乙個char型的指標變數pstduio,並且將studio變數的位址編號賦值給pstduio,由於char型(取值範圍-128~127)只佔乙個位元組,所以指標pstduio只能指向乙個位元組的值,也就是指向了studio變數的位址(編號40)的值。*pstduio就是指編號40的值,而且只能是編號40的值,與已經沒有直接關係了。編號40裡的內容「00000001(由低位到高位)」,其最高位為符號位,『1』表示負數 ,」10000000(由高位到低位)「是-128的補碼,轉換成十進位就是-128,所以你輸出的就是-128
附:計算機儲存的是補碼,正數的補碼是其本身,負數的補碼是其反碼加1128的原碼 10000000
128的反碼 11111111(符號位不變,其餘位取反)128的補碼 10000000(符號位不變,反碼加1)
如何理解char型指標與int型指標的不同表現
3樓:
char型指標和int型指標,指標變數本身都是佔4個位元組的記憶體空間,可以通過sizeof(char*)或者sizeof(int*)來得到佔用的位元組空間數,存放的都是乙個32位的位址值。不同之處在於,char*指標型別和int*指標型別在做算術運算的時候,位址值的變化是不一樣的。例如,char *ps; //假設ps存放的位址值是0x1000
ps++;//ps自增加1,則ps存放的位址值就變為了0x1001,因為char型別是佔乙個位元組,/也就是說,ps指向了下乙個char型的記憶體位址。
int *pn; //如果是int型指標,假設初始也是0x1000
pn++;//pn自增加1,則pn存放的位址值就變為了0x1004,因為int型別是佔4個位元組,/也就是說,pn指向了下乙個int型的記憶體位址。
從上面可以看出,指標變數之所以有型別,是方便指標變數在進行指標移動的時候,它是按照資料型別所佔用的記憶體空間的位元組數的倍數關係進行移動的,pn=pn+4,則pn移動的位元組數實際上是sizeof(int)*4=4*4=16個位元組數,這樣做,那麼用指標訪問記憶體中的資料就顯得很是方便了,是吧。
還有一點就是,記憶體位址空間一般是按照位元組來編址的,即乙個位元組編乙個號碼,這個號碼就是這個位元組的位址,這個位址是具有唯一性的。
c語言 unsigned char指標 指向int位址
4樓:匿名使用者
1. 在p_ip++ 後面漏了分號。
2. 兩處的 unsigned char *p_ip = ip; 要加個類鄭派型強喊薯賀轉,改成。
3. 在輸出後面加手坦個sleep(10000);之類,不然螢幕一閃而過,看不到輸出。
對於指標來說,它指向int型別和指向char型別有沒有區別?
5樓:網友
指標的型別表示指標指向的記憶體單元的資料所表示的型別。
指向int型別的指標表示指標指向的記憶體位址儲存著的是int型別的資料。
同理,指向char型別的指標表示指向的記憶體位址中儲存的是char型別的資料。
指標本身來講,只是記錄了乙個位址,指標的型別表示記錄的位址所儲存的變數資料的型別,兩者的區別僅此而已。
6樓:網友
是有區別的。因為這兩種型別變數佔用的記憶體空間是不同的。我們知道當指標變數加1時表示當前的指標向下移動乙個「單位」,如果是int型的,就需要移動兩個位元組,而如果是char型 的,就只需移動乙個位元組。
7樓:網友
指標本身是乙個int型別的變數。
它定義的時候的int和char只是說明它能指向什麼型別的位址。
比如定義int *p,那麼p只能存放整型型別的位址。
8樓:今天不寫程式
這個不應該是問題,沒有區別,就不會分"指向int型別"和"指向char型別"
9樓:網友
不知道樓上同學所說的整形型別的位址是乙個什麼概念。
位址就是位址,沒有所謂整形char形之分。
int* 和char*的區別體現在訪問指標指向記憶體時的方式,也即所謂的結構化記憶體訪問。比如*(int *)p 和 *(char *)p,訪問的顯然是不一樣的記憶體。
上面有同學說到++時偏移量的不同,這也是乙個方面。
c++ int型指標和char型指標有什麼區別,
10樓:風若遠去何人留
本質上來說是一樣的,不管是什麼指標,其本質就是乙個位址。
但是在使用上還是有所不同的。
1 預設指向空間佔用的大小不同。
int *指向空間需要有4個位元組,char*指向空間有乙個位元組就可以了。
如果int*指向的空間不足,那麼對其讀寫時就會出現越界操作。
2 使用時的可取值範圍不同。
用*取值時,int *得到的值是int型別的範圍,而char *可以取到的值是char的返回。
3 賦值時範圍不同。
用*p形式賦值時,如果是int*型的,會按照int來擷取;如果是char *型的,會按照char的範圍來擷取。
比如執行*pa = 0x12345678後,*pa的值就是0x12345678。
執行*pb =0x12345678後,*pb的值就會被擷取,值為0x78。
4 用於輸出時結果不同。
cout <的形式,*pa會按照整型輸出,而*pb會輸出乙個字元。
11樓:北風微風
cout 過載了運算子<<,當輸出是char*的變數時,當作字串輸出。對於其他型別的只輸出指標的值。
關於指標資料型別的強制轉換,比如說int型轉換為char型是不是隻是將該指標的記憶體大小由4個位元組變為乙個字
12樓:網友
記憶體大小並未改變,只是讓char *o 指標指向了int 型的低位。
除錯是硬道理!
程式:#include
int main()
int i=789;
char *o=(char *)i;
printf("%d, %c", i, *o);
return 0;
除錯結果:
13樓:網友
沒有意義的,o指向的是i的位址,乙個不確定的16進位數,轉成char,表示範圍減小,資料被截斷,仍然不知道是什麼值。
14樓:網友
輸出ascii碼值為i的字元,比如說i=97,按你說的轉換後就會輸出a字元。
15樓:網友
*0這個指標型的空間裡存的int i的位址。
如果把i強制轉換成char型。
是相當於又開闢了乙個char 的空間。
你輸出i就是i。
輸出char型就是char型。
16樓:啊你哦哈賽由
1樓說的差不多,但是輸出的結果和你這個板子的儲存方式是有關係的。你需要看一些大端儲存和小端儲存的知識。輸出的結果不一定是int的最低位,也可能是最高的兩位,你自己**試試。
既然指標都是位址,為什麼不能所有的指標都是int型別?位址又沒有小數點…
17樓:網友
c語言的指標變數大小本身是4個位元組的(32位,64位攔粗是8個位元組),不管這個指標變數的逗閉型別是char,int或者long
指標的型別和操作指標位移時山衡裂候,一次位移距離有關,比如int *int_p; int_p++的操作,指標一次位移4個位元組,因為所指向型別是int也就是4個位元組。
再比如,char * p; p++;這裡p的位移操作,一次距離是1個位元組,因為char本身是乙個位元組。
不知道說明白沒有,這是自己領悟到的!
18樓:二維驗證碼
指標的型別是指的是,它所指鎮亂帆向的資料的型別。
也就是說陪搏,如果它指向的資料是int型,指標就是int型;指向的資料是double型,指標就御雹是double型。
有乙個 char * 型指標正巧指向一些 int 型變數, 我想跳過它們。為什麼如下的** ((int *)p)++; 不行?
19樓:網友
在 c 語言中, 型別轉換意味著 ``把這些二進位位看作另一種型別, 並作相應的對待"; 這是乙個轉換操作符, 根據定義它只能生成乙個右值 (rvalue)。而右值既不能賦值, 也不能用 ++自增。(如果編譯器支援這樣的擴充套件, 那要麼是乙個錯誤, 要麼是有意作出的非標準擴充套件。
要達到你的目的可以用:
p = (char *)int *)p + 1);
或者,因為 p 是 char * 型, 直接用p += sizeof(int);
但是, 在可能的情況下, 你還是應該首先選擇適當的指標型別, 而不是一味地試圖李代桃僵。
C 基類指標指向派生類指標時,指標可以用派生類的非虛方法嗎
需要知道一些常識,一個類所有的函式都是再code 區中唯一的存放一份。而資料成員則是每個物件儲存一份,並按照宣告順序依次存放。類a中有了虛擬函式就會再類的資料成員的最前面新增一個vfptr指標 void vfptr 這個指標用來指向一個vtable表 一個函式指標陣列 一個類只有一個該表 該表儲存著...
請教下用A LEVEL成績申請滑鐵盧計算機系的一些問題
我在國外申請的。我不知道情況是不是一樣。另外我是讀好高二出國的。我填的時候。老師說有高中成績最好。但是沒有也沒關係。我看他們好像是要會考成績。如果你現在放雅思成績,對你的申請會有一點點幫助。但是總體來說放不放都沒關係。等conditional offer出來再考。來得及。我個人感覺學校沒有很在乎。不...
想請教下板友,滑板玩ollie的時候前腳用哪個地方刷板,鞋底
滑板ollie 刷版位置 是鞋側面 膠皮上面 有點鞋面 位置在腳趾活動關節處 相當於小回腳趾根部答 滑板做ollie的時候 前腳只用刷板帶板 就是後腳發力起跳就行了吧?前腳是不是隻用刷板 不用發力啊 你說的對,但是這個動作需要反覆練習找感覺,我現在還在練,跳的不高,落地 專不穩,究其原因自認屬為是後...