首页 > 试题广场 >

下面程序运行后的结果为:

[单选题]
下面程序运行后的结果为:
char str[] = "glad to test something";
char *p = str;
p++;
int *p1 = reinterpret_cast<int *>(p);
p1++;
p = reinterpret_cast<char *>(p1);  
printf("result is %s\n", p);

  • result is glad to test something
  • result is ad to test something
  • result is test something
  • result is to test something
推荐
该题的关键是要认清楚强制类型转换后指针的类型。
p的类型为char *,p++后p指向str数组的第2个元素即字母“l”的位置。
p1的类型为int *,p1++后p1指向的位置增加4个字节,指向str数组中的第6个元素即字母“t”的位置。
因此最后p的内容为“to test something”。

选D
编辑于 2015-02-03 14:27:22 回复(7)
charstr[] = "glad to test something";                   //定义字符串

char*p = str;                                                       //p指向字符串首地址,即字符'g'

p++;                                                                   //p是char*类型,每次移动sizeof(char)字节,故此时p指向 'g'的下一个字符 'l'

int*p1 = reinterpret_cast<int*>(p);                     //指针p被重新解释为整型指针并被赋值给p1

p1++;                                                                  //p1是int*类型, 每次移动sizeof(int)字节,故此时p1 指向 'l'后的第四个字符 't'

p = reinterpret_cast<char*>(p1);                        //指针p1被重新解释为字符型指针并被赋值给p

printf("result is %s\n", p);                                     //从't'开始输出字符串,即得到 "to test something"
发表于 2017-05-18 16:12:14 回复(7)
reinterpret_cast用来将类型A按照类型B来解释。这样,就可以按照B类型来处理对象,当需要再按照A类型处理时,则需要再次使用该关键字将对象按照A类型解释。这样使用不安全,但是有时候非用不可。
发表于 2016-06-05 19:40:42 回复(0)
开始p指向 glad to test something”中的g,然后p++,指向l
int *p1 = static_cast(p); 把p赋值给int型了
p1++,即加了4个字节位置。即p1指向“glad to test something”中的to 't'
p = static_cast(p1); 把p1的转回了p,p指向了 glad to test something”中的to 't'
输出从to 't'开始
to test something
编辑于 2017-05-11 00:22:16 回复(0)
执行p++,移动一个字符得到“lad to test something”,转换为int型,移动四位得到“to test something”
发表于 2015-01-22 16:34:17 回复(0)
我们现在大多电脑内存32位,指针是指向内存地址的,也就是所无论什么类型的指针sizeof()都是32位,4个字节。可以试试哦,sizeof(char)sizeof(int)
但是不同类型的指针的作用是想着指向一个数据,如果++,指向下一个数据,那么此时地址的++肯定就是加相应类型的长度,所以这里有char的加的是一个字节,int的加的是4个字节。
发表于 2015-08-24 22:13:01 回复(1)
本题是有错误的,指针之间的类型转换用static_cast根本不能实现
发表于 2015-08-03 09:33:59 回复(3)
理解不同类型指针的++是针对单位而非内存地址,这个就很简单了。
第一个p++;p偏移一个sizeof(char)的空间,得到"lad to test something"。
第二个p++;此时p已经被转换为int型指针,p++即偏移一个sizeof(int)的空间,偏移后其实际地址指向't'.
因此,结果为:"to test something"
发表于 2021-10-16 16:56:55 回复(0)
char每次移动1个字节,short每次移动2个字节,int,long,float移动4个字节,double8个字节
发表于 2021-07-06 21:12:33 回复(0)
reinterpret_cast是C++里的 强制类型转换 符。 注意强制类型转换。
不同类型的指针的作用是想着指向一个数据,如果++,指向下一个数据,那么此时地址的++肯定就是加相应类型的长度,所以这里有char的加的是一个字节,int的加的是4个字节。
编辑于 2017-06-04 14:59:40 回复(0)
强制类型转换:int*p1 = reinterpret_cast<int*>(p);
                        把char型指针转换为int型。这样p++时,是按sizeof(int)即4个字节移动的,此时指向glad后面的空格,于是再输出时,是从空格及其之后开始。
发表于 2017-04-18 11:22:34 回复(0)
p1加了四个字节
发表于 2016-09-17 17:40:18 回复(0)

首先,声明了一个字符数组str并初始化为 "glad to test something",然后将str数组的首地址赋值给指针p。

p++等价于p = p + 1,即将p的值增加 1,此时p指向字符 'l'。

然后使用reinterpret_cast将p转换为指向int类型的指针。这里需要注意的是,reinterpret_cast是 C++ 中的一个类型转换操作符,它可以将一个指针或引用转换为其他类型的指针或引用,但是不能用于不同类型之间的转换,因为这样会违反类型系统的语法规则。在这里使用reinterpret_cast将char*类型的指针转换为int*类型的指针,虽然是非法的类型转换,但是并不会导致程序崩溃等问题,因为在指针的底层实现中,实际上存储的都是内存地址,只是解释方式不同而已。

接着对p1进行自增操作,即将p1的值增加 1 个int类型的长度(通常是 4 或 8 个字节),因为此时p1指向l后面的a,所以此时p1的值应该是指向字符数组中 't' 所在的位置。

最后将p1转换为char*类型的指针并赋值给p,此时p指向字符数组中 't' 所在的位置。

最终输出p指向的字符串 "to test something"。

因此,选项 D "result is to test something" 为正确答案。

发表于 2023-11-21 14:34:42 回复(0)
空格啊我去
发表于 2024-11-12 16:02:39 回复(0)
指针偏移是类型偏移!!!
发表于 2024-09-13 11:40:29 回复(0)
我又瞎了,没看到是int
发表于 2023-04-14 17:23:09 回复(0)
reinterpret_cast〈新类型〉(表达式)用于任意类型之间的转换。 1)reinterpret_cast并不在类的层次中穿行,即不关心继承体系; 2)reinterpret_cast用于任意类型的转换,当然,和其它强制转换一样,存在安全性; 3)  reinterpret_cast不会强制去掉const; 4)reinterpret_cast后的尖括号中的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。
发表于 2023-02-27 09:11:57 回复(0)
空格也算在移动的字节数li m
发表于 2022-03-10 13:42:24 回复(0)
注意指针类型,然后确定移动步长~
发表于 2021-03-29 09:03:59 回复(0)
强制转换后的指针类型变化
发表于 2021-03-13 02:19:09 回复(0)
char 类型每次移动一个字节,
int 类型每次移动4个字节!
发表于 2021-03-09 15:34:39 回复(0)