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);
答案 0 :(得分:5)
激活诊断并且不要忽略它们(-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。
答案 1 :(得分:3)
将字符对象解释为整数
printf("%c\n%p\n%c\n", k, j, *j);
或将char的地址存储到int指针
j = &k;
是未定义的行为。
在你的情况下,你偶然得到了相同的结果。代码不正确,也可以打印任何内容。
答案 2 :(得分:1)
char *a
a
是指向某事物的指针。那个东西是char
int *b
b
是指向某事物的指针。那个东西是int
a
和b
都是指针,它们只将内存地址存储到其他内容中,这就是可能的原因(但绝对不推荐; {{1}默认情况下,warning
与error
)将-wError
的地址存储在int
中。
取消引用它是未定义的行为和“anything could happen”,这就是首先出现警告/错误的原因。
可以使用您当前的计算机和编译器。虽然不能保证,但实际上任何东西都可以打破它。不要这样做
答案 3 :(得分:0)
在您的情况下,它会给出相同的值,因为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
视为输出。第三个打印语句清除一切。
希望这有助于理解这里的差异。
答案 4 :(得分:0)
char指针和int指针有什么区别?
不考虑你的代码,答案是简单的Char指针指向一个内存地址,它保存一个char值,一个int指针指向一个int值。这仍然是他们之间的差异。但是,当您强制编译器执行他们尚未指定的操作时,您会收到错误或未指定的行为。
那么,您的代码是什么?
这已经在答案中得到了很好的解释,但基本的是char存储为ascii值,因此在你的情况下,int指针可以指向char。