int * a和char * a之间的区别?

时间:2014-10-23 10:18:48

标签: c pointers

char *aint *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);

5 个答案:

答案 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

ab都是指针,它们只将内存地址存储到其他内容中,这就是可能的原因(但绝对不推荐; {{1}默认情况下,warningerror)将-wError的地址存储在int中。
取消引用它是未定义的行为和“anything could happen”,这就是首先出现警告/错误的原因。

可以使用您当前的计算机和编译器。虽然不能保证,但实际上任何东西都可以打破它。不要这样做

答案 3 :(得分:0)

在您的情况下,它会给出相同的值,因为sizeof(int)>size(char)。如果您真的想看到char*int*之间的区别。让我们这样做:

假设:char属于1 byteint4 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。