2015阿里巴巴招聘在线笔试试题_数据研发工程师

题目:

(2) 已知inta[]={1,2,3,4,5};int*p[]={a,a+1,a+2,a+3};int**q=p;表达式* (p[0]+1) +**(q+2)的
值是 _。
A.5
B.6
C.7
D.8
E.4
F.9


分析:p为指针数组,每一组的开始分别是指向

a,a+1,a+2,a+3所代表的地址的指针,比如p[0]=a=&a[0],p[1]=a+1=&(a[1])

故* (p[0]+1)为*p[0][1],即a[1],为2

q=p,q为指针的指针,**(q+2)为p[2][0]的值,,即a[2],为3


代码:

#include <stdio.h>
void ali2()
{
printf("Hello ali2\n");
int a[]={111,2,3,4,5};
int *p[]={a,a+1,a+2,a+3};
int **q=p;
int value=*(p[0]+1)+ **(q+2);
printf("\n%d\n",value);
printf("\n%d\n",*(p[0]+1));
printf("\n%d\n",**(q+2));
// return 0;
}


结果:

Hello ali2

5

2

3
Press any key to continue


故验证了前面的分析。




更详细分析:

#include <stdio.h>
void ali2()
{
printf("Hello ali2\n");
int a[]={1,2,3,4,5};
int *p[]={a,a+1,a+2,a+3};
int **q=p;
int value=*(p[0]+1)+ **(q+2);
printf("value=%d\n",value);
printf("*(p[0]+1)=%d\n",*(p[0]+1));
printf("**(q+2)=%d\n",**(q+2));


printf("--------\n");
for(int i=0;i<=3;i++){
printf("**(q+%d)=%d\n",i,**(q+i));
}
printf("--------\n");
for(int j=0;j<=4;j++){
printf("*(*(q+0)+%d)=%d\n",j,*(*(q+0)+j));
}
printf("--------\n");
for(int j1=0;j1<=3;j1++){
printf("*(*(q+1)+%d)=%d\n",j1,*(*(q+1)+j1));
}

printf("--------\n");
for(int j2=0;j2<=2;j2++){
printf("*(*(q+2)+%d)=%d\n",j2,*(*(q+2)+j2));
}

printf("--------\n");
for(int j3=0;j3<=1;j3++){
printf("*(*(q+3)+%d)=%d\n",j3,*(*(q+3)+j3));
}
/*
for(int k=0;i<=3;k++){
for(int j=0;j<=1;j++){
printf("*(*(q+%d)+%d)=%d\n",k,j,*(*(q+k)+j));
}
}*/
// return 0;
}


输出:

Hello ali2
value=5
*(p[0]+1)=2
**(q+2)=3
--------
**(q+0)=1
**(q+1)=2
**(q+2)=3
**(q+3)=4
--------
*(*(q+0)+0)=1
*(*(q+0)+1)=2
*(*(q+0)+2)=3
*(*(q+0)+3)=4
*(*(q+0)+4)=5
--------
*(*(q+1)+0)=2
*(*(q+1)+1)=3
*(*(q+1)+2)=4
*(*(q+1)+3)=5
--------
*(*(q+2)+0)=3
*(*(q+2)+1)=4
*(*(q+2)+2)=5
--------
*(*(q+3)+0)=4
*(*(q+3)+1)=5
Press any key to continue