首页 > 试题广场 >

以下程序打印的两个字符分别是?

[单选题]
以下程序打印的两个字符分别是?
#include<stdio.h>
#include<iostream>
using namespace std;
typedef struct object object;
struct object {
    char data[3];
};

int main(void) {
    object obj_array[3] = {{'a', 'b', 'c'}, {'d', 'e', 'f'}, {'g', 'h', 'i'}};

    object *cur = obj_array;
    printf("%c %c\n", *(char *)((char *)(cur) + 2), *(char *)(cur + 2));
    return 0;
}

  • c g
  • b d
  • g g
  • g c
推荐
gca头像 gca
A. c g
cur本为object类型指针 第一个占位符输出时,参数中将cur先强制转化为字符型指针 然后加2,即指向obj_array数组的第一个元素中的字符c,而第二个占位符输出时,参数中先让cur指针加2,即到达obj_array第3个元素的地址处,然后强制转化为字符型指针,再用*获取1个字节的内容即字符g
编辑于 2016-01-12 13:38:58 回复(0)
本题typedef 与return 0后面没有分号,但是本题重点不是这,只是提一下。

首先明白,cur是数组首地址,这毋庸置疑,其次要知道它的偏移量是和它的类型有关的。

*(char*)((char *)(cur)+2),cur被强制转化为char*类型,然后+2,那么就是加两个字节,就是c。外面那个(char*)是为了转换为字符型指针与%c对应,本题可以不要,因为本来就是字符。

*(char*)(cur+2)),cur的类型是object*,那么cur+2就是加两个obect的大小,就是6,因此是g。同样,外面那个(char*)是为了转换为字符型指针与%c对应,本题可以不要,因为本来就是字符。
发表于 2016-12-17 13:35:40 回复(2)
此题主要是考察指针的步长,指针加1 是和指针所指向的类型相关的 ,如果cur强制被转化成字符类型的指针,那么加2,就是加2个字符的大小,即为c,如果cur是对象指针,那么加2的话,就指向第3个object类型的对象。
发表于 2016-07-20 22:00:25 回复(2)
*(char *)(cur+2)中的 (char *)是为了修改成字符型指针,和输出的%c相对应。 *(char *)((char *)(cur)+2)中第一个(char *)的作用同上,第二个的作用是修饰(cur),因为指针加一个数,偏移量和这个指针类型有关,当它是char的类型的时候,+2的偏移量就是两个字节。
发表于 2015-11-06 21:51:13 回复(0)
obj_array[0]={‘a’,‘b’,‘c’};
obj_array[1]={‘d’,‘e’,‘f’}; 
obj_array[0]={‘g’,‘h’,‘i’};
(1)指针cur指向obj_array[0]所在的地址,将其转换成char*时,它便指向字符‘a’所在的地址
所以(char *)(cur)+2指向字符‘c’,则*(char*)((char *)(cur)+2)即为字符c
(2)同理,cur+2指向obj_array[2]所在的地址,则*(char*)(cur+2)即为字符g
编辑于 2017-07-26 21:49:22 回复(0)
1. char*(cur)+2 :将cur指向的指针转为char*类型的,换言之此时cur产生的效果就是一个字符串,字符串首地址+2指向第三个元素的地址 2. 第二个就是二维数组本质上是一维数组,原因一就是因为既可以使用数组下标[i][j]方式访问数据,也可以使用i*(第一个行元素的数量)+j ,这两者是等效的。 所以将内部的{}就看做是一个元素。再访问这个元素的内容
发表于 2017-09-11 23:46:46 回复(0)
printf("%c %c\n",*(char*)((char*)(cur)+2),*(char*)(cur+2));
这一部分可以改为
printf("%c %c\n",*((char*)(cur)+2),*(char*)(cur+2));
测试结果一样。
编辑于 2015-09-09 20:28:21 回复(0)
看了大佬解答,做个笔记,第一:(char*)(cur)+2是先转换再加二,于是是第一个data数组的第3个元素;第二:(cur+2)是直接指向了第3个data数组(的第1个元素)。
发表于 2022-10-13 15:43:46 回复(1)
参考大佬的解答加上自己的一点观点  不知道对不对
编辑于 2023-08-17 20:52:09 回复(0)
看清指针所指向的内容是十分重要的
发表于 2020-02-20 09:15:59 回复(0)
一起学习Q群:563615003
发表于 2017-03-23 12:39:40 回复(0)
Yoy头像 Yoy
注意类型指针+ 与 元素指针+ 的区别
发表于 2016-10-03 19:29:05 回复(0)
注意仔细辨别指针的类型转换。
发表于 2016-05-26 21:53:55 回复(0)
typedef后面没;
发表于 2016-01-21 09:40:07 回复(0)
object*cur=obj_array 
注意cur指针的类型==
发表于 2016-01-11 20:48:24 回复(0)