笔试题
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