Chinaunix

标题: 谁能解释一下这个函数的输出 [打印本页]

作者: mingyuexuan    时间: 2009-12-09 10:21
标题: 谁能解释一下这个函数的输出
#include <stdio.h>

main()
{
       char *s = "0123456789";
       unsigned long p = 0;
       p = (int *)s;
       printf("p = %s",p);
}
输出结果为: p = 0123456789

如果将最后一句改为:printf("p = %s",(void *)p);
结果不变,谁能解释一下原因?
作者: hellioncu    时间: 2009-12-09 10:43
printf看到%s,就把对应的参数当作 const char *处理
作者: mingyuexuan    时间: 2009-12-09 10:46
标题: 回复 #2 hellioncu 的帖子
那您觉得 p = (int *)s;  这句话有没有问题呢,如果没有问题,那应该是怎么赋值的呢
作者: hellioncu    时间: 2009-12-09 10:51
sizeof(指针) > sizeof(long)时会有问题

正式的代码不会像你这么写的吧
作者: mingyuexuan    时间: 2009-12-09 11:06
标题: 回复 #4 hellioncu 的帖子
我只是对强制类型转换不是很了解,就写了一个很别扭的代码,见笑了
作者: mingyuexuan    时间: 2009-12-09 11:09
标题: 回复 #4 hellioncu 的帖子
那在p = (int *)s; 中(int *)根本就没有起作用吧?
作者: busywhj    时间: 2009-12-09 11:43
标题: 回复 #1 mingyuexuan 的帖子
printf("p = %s",p);中%s说明从p中地址值所指的内容开始一直输出直到遇到'\0'为止。
作者: churchmice    时间: 2009-12-09 13:11
标题: 回复 #6 mingyuexuan 的帖子
就算起作用了又怎样?
int * 和char *的值都是一样的,你再怎么转化都是白搭
你写成 unsigned char *,double * 结果都是一样的
作者: churchmice    时间: 2009-12-09 13:14
要看差别用这个代码

  1. #include <stdio.h>
  2. int main( void )
  3. {
  4.   char *s = "0123456789";

  5.   short int *cs = 0;

  6.   int *ci = 0;

  7.   cs = ( short int * )s;
  8.   ci = ( int * )s;
  9.   cs++;
  10.   ci++;
  11.   printf( " %s", cs );
  12.   printf( " %s", ci );
  13.   return 0;
  14. }
复制代码

我的机器上short int 是两个字节,int是4个字节
作者: mingyuexuan    时间: 2009-12-09 16:14
标题: 回复 #9 churchmice 的帖子
你这个代码的差别在哪里呢,仅仅是在cs++ 和ci++上吧,这个在强制类型转换上还是没有起作用啊,不知道是不是我没有理解您的意思,您能否解释一下呢?
作者: cnzhaopeng    时间: 2009-12-09 17:58
标题: 回复 #10 mingyuexuan 的帖子
指针步进值不同
作者: _unistd_    时间: 2009-12-09 18:09
告诉楼主一句精华:C语言是弱类型语言,,就和javascript中的变量使用var声明一样,C语言中没有类型这一说法,,char, int ,fload, struct等类型,只不过是为了方便使用而设计的,没有任何实际意义,C语言中的所有类型,都是只是一块内存而已,至于这块内存的大小和内容,随你的便。。。。。。
作者: churchmice    时间: 2009-12-09 19:19
标题: 回复 #10 mingyuexuan 的帖子
这还没起作用?
难道你还指望着s会发生改变?how?
作者: mingyuexuan    时间: 2009-12-10 09:40
步进值不同大家都明白的...
作者: mingyuexuan    时间: 2009-12-10 09:43
标题: 回复 #12 _unistd_ 的帖子
确实很经典!
作者: mingyuexuan    时间: 2009-12-10 09:45
标题: 回复 #13 churchmice 的帖子
其实我的期望是在我写的那个例子里面,编译器能够报错...
作者: mingyuexuan    时间: 2009-12-10 09:47
对C语言又有了新的认识啦,感谢各位大侠的帮助
作者: wolfired    时间: 2009-12-10 09:51
对指针进行强转,只是告诉编译器强转后应该从内存中读多少个字节,像LZ这样

unsigned long p = 0;
p = (int *)s;

我想可能再有一个隐式的转换吧!

到了
printf("p = %s",p);

编译器才不管p到底原本是什么,直接当它是个地址(也许会当成是char*),无差别的输出到'\0'为止
作者: langue    时间: 2009-12-10 10:02
由于历史原因,C语言一般工作在比较底层的位置,以效率和简洁见长,对类型的处理就不如C#/Java这样类型安全的语言。
作者: churchmice    时间: 2009-12-10 13:57
标题: 回复 #16 mingyuexuan 的帖子
你都已经强制类型转换了,编译器再报错你就该骂编译器傻x了。
编译器顶多给你报一个warning
开-Wall就能看到了
作者: mingyuexuan    时间: 2009-12-10 15:34
标题: 回复 #20 churchmice 的帖子
原来一直是我跟自己过不去...




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2