c语言char和int可以互相赋值,但指针不能赋值,char *和int *不能直接赋值,为什么呢?谢谢

如题所述

char 和 int 是通过ASCLL码相互赋值的 例如 a 以 %d 输出 则为97 以%c输出则为'a' char指针和int指针 之所以不能相互赋值是因为他们的长度不同 Tc 下 char 只有一个字节8个二进制位 而int 则是两个字节16个二进制位 由于指针所指向的是变量的起始地址 那么在当指针指向一段连续内存时 它找到每个变量是通过对起始地址运算得到的下一个元素的起始地址 然后根据长度 取出里面的内容 输出我们想要的格式 所以不同的类型长度不同 相互赋值 必定无法得到想要的结果 追问: char *a;int *b;a = b;这样编译不通过,a和b里都是地址,为什么不能赋值呢,而*a = *b可以 回答: a=b;这样的表达式是不对的,首先你的指针没有指向任何地址 *a=*b 是内容赋值 类型和ASCLL码之间转换是一样的 追问: char *a = NULL;int *b =NULL;a = b;这样也不对 回答: 指针相互赋值 必须类型相同 指针不能在没有指向时调用 给你打个比方吧 char *p 是认为在一段内存中8个二进制位是一个值 int *p 是认为在一段内存中16个二进制位是一个值 如果你把int 的指针地址给了char 结果char只取了8个二进制位 那么你说 这个值会和int取出来的一样吗?肯定是不一样的,所以不允许他们赋值,因为长度不同,如果类型相同,长度也就相同,赋值是没问题的 追问: 是不对,但编译不通过,long a;char b;b =a;这样长度也不同,但编译能通过,有警告conversion from 'long' to 'char', possible loss of datalong a;char b;b =a;编译不通过,有错误annot convert from 'long *' to 'char *'是不是指针特别,谢谢 回答: 这是赋值这种情况会有溢出的情况char 的范围 在无符号的情况下 是1-255 long 已经超出了这个范围 所以会有溢出 追问: 谢谢,还是有些迷糊,指针之间也是赋值,编译为啥错误呢,直接就编译不通过, 回答: 建议你先看一下基础知识 一般的C语言入门书 都会有 现在你知道他们的规则就足够了 如果需要知道的更多 你还需要去了解汇编之类的知识 提问者 的感言: 很好2012-06-03
温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-05-04
因为char是1字节,而int一般是2或4字节,
char与int只在-128到+127之间时才等价,而int一般是+-3万左右,所以指针是不能等价的.