[英]Difference between int*a and char *a?
char *a
和int *a
之間有什么區別,因為兩者都在用於存儲字符指針的代碼塊上工作,例如。
char *c, k = '$';
int *j;
j = &k;
printf("%c\n%p\n%c\n", k, j, *j);
c = &k;
printf("%c\n%p\n%c", k, c, *c);
激活診斷程序,不要忽略它們( -Wall -Wextra -pedantic-errors
)。
編譯器應告訴您您正在執行不允許的操作。
參見此處關於coliru的信息: http ://coliru.stacked-crooked.com/a/31acb5b670254167
main.cpp:7:7: error: incompatible pointer types assigning to 'int *' from 'char *' [-Werror,-Wincompatible-pointer-types]
j = &k;
^ ~~
回答您的問題時, char
是一個比int
低的整數類型(它可能(實際上在實際上可以保證)更小的大小和值范圍),並且它的指針也是不同的類型。
UB使用錯誤類型的指針訪問對象(少數例外)。
將字符對象解釋為整數
printf("%c\n%p\n%c\n", k, j, *j);
或將char的地址存儲到int指針中
j = &k;
是不確定的行為。
在您的情況下,您偶然會得到相同的結果。 代碼不正確,可能還會打印任何內容。
char *a
a
是指向某物的指針。 那是一個char
int *b
b
是指向某物的指針。 那是一個int
a
和b
都是指針 ,它們僅存儲指向其他對象的內存地址,這就是為什么有可能(但絕對不建議;默認情況下warning
, -wError
error
)將int
的地址存儲在char *
。
取消引用是未定義的行為,並且“ 可能發生任何事情 ”,這就是為什么警告/錯誤首先出現的原因。
它可能適用於您當前的機器和編譯器。 雖然不能保證,但實際上任何事情都會破壞它。 不要做
在您的情況下,它將給出相同的值,因為sizeof(int)>size(char)
。 如果您真的想看看char*
和int*
之間的區別。 我們開工吧:
假設: char
為1 byte
, int
為4 byte
,地址也為4 byte
。 觀察char*
和int*
之間的區別。
int k=1024;
char* charptr= &k;
int* intptr=&k;
printf("%02x \n\n", *charptr); // this will simply print `00`
printf("%02x \n\n", *intptr); // this will simply print `400`
int i=0;
for(; i<4 ; i++)
printf("%02x ", *charptr++); // this will print `00 04 00 00`
注意:這是一個小端的機器。 第一次打印僅顯示第一個字節的內容,因此我們將00
作為輸出。 第三個打印語句清除所有內容。
希望這將有助於理解此處的區別。
char指針和int指針有什么區別?
不用考慮代碼是什么,答案很簡單Char指針指向一個存儲有char值的內存地址,而int指針指向一個具有int值的地址。 這是並且仍然是它們之間的區別。 但是,當您強制編譯器執行未指定的操作時,您會得到錯誤或未指定的行為。
那么,您的代碼怎么了?
答案中已經對此進行了很好的解釋,但是最基本的是char是作為ascii值存儲的,因此在您的情況下,int指針可以指向char。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.