qq_41870875
2021-05-09 17:23
采纳率: 100%
浏览 52

c语言送分题!!!!!!!!!!!!!!!!!!!!!

如题
一段内存地址 0-11 下存储着"hello world!" 字符
已知指针void *p 指向首地址0x1a000 , 和指针char *s;要求可以类型转换 但不能创建变量和指针 ,步骤不限 , 仅能使用 且 最后一步用printf("%s",*s); 将hello输出到屏幕
int main()
{
char *s;
/*
步骤不限 不能创建变量 和指针 也不能用其他函数和功能
*/

printf("%d\n",*s);
}
 

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • 正在学C++ 2021-05-09 17:37
    已采纳
    #include<stdio.h>
    int main()
    {
        char hello[] = {"hello world!"};
        void *p = hello;
    
        char *s;
        s = (char*)p;
        while ( *s!=' ') s++;
        *s = '\0';
        s = (char*)p;
    /*
    步骤不限 不能创建变量 和指针 也不能用其他函数和功能
    */
    
        printf("%s\n",s);
        return 0;
    }
    点赞 打赏 评论
  • 正在学C++ 2021-05-09 21:32
        void *p; //或者把p定义为char指针更方便  p现在存储的就是一个地址数据
        char *s; //道理就是一个指针s向后移动,以找到末尾并改变成'\0',p依旧指向第一个地址
        s = (char*)p;
        while ( *s!=' ') s++;
        *s = '\0';
        s = (char*)p;
        printf("%s\n",s);//这样的话就可以通过p从头输出字符串

    那你只看这个,我写数组是为了程序可以执行下去。那你现在让p存放你的首地址或者指向你的第一个字符数据。

    点赞 打赏 评论
  • qq_41870875 2021-05-09 22:25
    printf("char arr %s\n",(char *)p+4);//输出正常:hello wo
    printf("char arr %s\n",(*(char *)(p+4))); //报错 Segmentation fault (core dumped)
    printf("int %d\n",(int *)p+0);//异常输出 :-1714184192
    printf("int %d\n",(*(int *)(p+0)));//正常输出:10
    
    //(*(type *)(p+0))  和 (type *)p+4   , int 和char  他们的用法也不一样吗
    点赞 打赏 评论
  • 正在学C++ 2021-05-09 22:27

    你printf("%s\n",(char*)p+4);能打印出hello wo?不可能的,如果你的p指向第一个字符,p+4指向第四个字符,怎么可能输出前面三个字符?那你的p肯定不是指向第一个字符。

    char指针8个字节,指的是指针占用8个字节,也就是它的寻址空间是8个字节的空间,因为在64位机器上。和输出几个字符没有关系。指针存储的是一个地址,按照这个地址找过去,存储的才是一个字符。

    (char *)p+4表示指向的是第四个字符,这个表达式的值是第四个字符的地址。

    (char *)(p+4)表示void型的p指针先向后移动4位,然后转换城char类型的指针,前面加一个*表示取这个字符

    点赞 打赏 评论
  • C和C++技术博客 2021-05-09 22:55


    希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html
    希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html

    点赞 打赏 评论

相关推荐 更多相似问题