笔试题


1、

int a[][3]={{1,2,3},{4,5,6}},(*pa)[3],i;
pa=a;
for(i=0;i<3;i++)
{
     if(i<2)
    {
        pa[1][i]=pa[1][i]-1;
     }
    else
    {
       pa[1][i]=1;
     }
}
printf("%d\n",a[0][1]+a[1][1]+a[1][2]);

 答案:7

解析: 

int (*p)[3]      p:一个指向 含有3个元素的一维数组 的指针;

for循环作用:将pa[1][0],pa[1][1]的值修改为原来的值-1;pa[1][2]=1;

最后输出的pa[2][3]=1 2 3

                                 3 4 1

pa是指针 所以会改变原来a的值。

所以a[0][1]=2+a[1][1]=4+a[1][2]=1  =7;

2、

int a[3][3],*p,i;
p=&a[0][0];
for(i=0;i<9;i++)
{
  p[i]=i+1;
}
printf("%d\n",a[1][2]);

答案:6

解析:通过一个for循环给p[i]赋值

int *p ;p=&a[0][0];  p指针  指向了二维数组的第一个元素   

代码等于在给二维数组a循环赋值1-9;

3、

int a[8]={0,1,2,3,4,5,6,7};
int *p=a;

printf("1 %d\n",*(a+4));
printf("2 %d\n",p[4]);
printf("3 %d\n",*(p+4));

printf("4 %d\n",*p[4]);

以上4种方式,哪一种不能正确输出4?

答案:第4种 *p[4];    个人理解:数组下标【】=  * ;比如 a[1]=*(p+1)

对地址做加法的时候 要考虑 数据类型占得字节数  如果是int 类型 占4个字节  所以 a+4 地址需要偏移16位

4、

static void func(int * arg)
{
       static int i=2;
  switch(*arg)
  {
        case 1:
    *arg +=++i;
    case 2:
    *arg +=i<<1;
    default:
    *arg-=011;
  }
}

int main()

  int cnt=(2,1);//这是啥??

  //如果是按照(x,y)方式定义 ,cnt=y 

     func(&cnt);

  func(&cnt);
  printf("%d\n",cnt);

答案:4

解析:

第一次执行完func(&cnt); cnt=1;

第二次执行func(&cnt); cnt=4;

重点:

switch case里面没有break; 会一直执行到default;

default 里的 011是8进制

*arg +=i<<1;  左移;

5、

int rj;
rj=5;
if(rj=8)
{
rj=rj>5?4:7;
}
printf("%d",rj);

答案:4

解析:if()语句中是rj=8;对rj二次赋值,所以 rj=8>5成立,输出4

6、

char *a="AbCdEf";
char *b="aB";
a++;
b++;
printf("%d\n",strcmp(a,b));

答案:strcmp(a,b)输出值=1 正数

解析:strcmp比较字符串是否相等,按题目分析 a++='b'  b++='B'

大小写字符间比较,转换为ASCll码比较,同个字母的大写比小写的值小

strcmp(a,b)比较字符串大小,相等返回0,a>b返回正数,a

7、

int i=143;

printf("%d\n",printf("%d\n",printf("%d",i)));

答案:

解析:

从最里层括号开始:printf("%d",i)  输出143

第二层括号:   printf("%d\n",printf("%d",i))          printf("%d",i)函数返回的是输出的字符串的长度,也就是3

最外层括号    printf("%d\n",3+'\n');  输出的是字符3+回车键的长度 =2;

8、

char word[13]={0};
memcpy(word,"Hello-Ruijie",5);
printf("%s",word);
strcpy(word,"Hello-Ruijie");
printf("%s",word);
memcpy(word,"Hello-Ruijie",9);
printf("%s\n",word);

答案:

解析:

char word[13]={0};//只能存放长度为12的字符串

①执行第一句memcpy(),将字符串前5个字符拷贝进word

输出:Hello

②执行第二句 strcpy(),从word字符串的第0个位置开始填充,覆盖掉前面的hello

输出:Hello-Ruijie

③执行第三句 memcpy(),内存拷贝,将字符串前9个字符拷贝进word

如果只有单独的第三句memcpy(),输出应该是Hello-Rui

由于程序前面执行了strcpy()语句,memcpy()将9个字符从word的第0个位置开始填充,无法遮盖掉原有的第9-12个位置的字符

最后word输出:Hello-Ruijie

9、

int arr[]={98,15,100,888,252,11};
int *p=&arr[2];
printf("%d,%d,%d,%d\n",*(p-1),*p,*(p+1),*(p+2));

答案:15,100,888,252

解析:

&arr[2] ;整数数组的第三个元素的地址

*(p-1):p-1 地址偏移4个字节 得到第二个元素的地址,*(p-1)取地址上的值 15

*p:取第三个元素的值 100

*(p+1):地址向后偏移4个字节,取第4个元素的值 888

*(p+2):地址向后偏移8个字节,取第5个元素的值 252

相关