如题
一段内存地址 0-11 下存储着"hello world!" 字符
已知指针void *p 指向首地址0x1a000 , 和指针char *s;要求可以类型转换 但不能创建变量和指针 ,步骤不限 , 仅能使用 且 最后一步用printf("%s",*s); 将hello输出到屏幕
int main()
{
char *s;
/*
步骤不限 不能创建变量 和指针 也不能用其他函数和功能
*/
printf("%d\n",*s);
}
#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;
}
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存放你的首地址或者指向你的第一个字符数据。
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 他们的用法也不一样吗
你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类型的指针,前面加一个*表示取这个字符
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html