易出错的C语言题目之二:指针

一、写出输出结果

#include<stdio.h>

int main(){
int a[];
a[] = ;
a[] = ;
a[] = ; int *p,*q;
p = a;
q = &a[]; int c = a[q-p]; printf("value c = %d/n",c++);
printf("value c = %d/n",c); return ;
}

答案:

value c = 2/nvalue c = 3/n

解析:

此处q-p=2,容易错,地址相减得除以类型,表面上差了8,实际上差了2。不同类型的地址,比如char *p,额int *p,p-q不能操作,报错。

二、写出下列函数运行结果

#include<stdio.h>

int main(){
int a[] = {,,,,};
int *ptr = (int*)(&a+); printf("%d,%d",*(a+),*(ptr-));
return ;
}

答案:

2,5

解析:

a表示数组首元素地址,即&a[0],该地址偏移大小为sizeof(int),而&a表示结构体的地址,该地址偏移大小为sizeof(a),即5*sizeof(int),a的类型为(int*)[5]

三、假如我们的a的地址是:0Xbfe2e100, 而且是32位机,那么这个程序会输出什么?

#include<stdio.h>
int main(){
int a[];
printf("%x\n",a);
printf("%x\n",a+);
printf("%x\n",&a);
printf("%x\n",&a+);
return ;
}

答案:

0Xbfe2e100

0Xbfe2e104

0Xbfe2e100

0Xbfe2e114

解析:

a表示数组首元素地址,即&a[0],该地址偏移大小为sizeof(int),因此a+1地址为0Xbfe2e100+sizeof(int) = 0Xbfe2e104;

而&a表示结构体的地址,该地址偏移大小为sizeof(a),即5*sizeof(int),a的类型为(int*)[5],因此&a+1地址为0Xbfe2e100 + 5*sizeof(int) = 0Xbfe2e114(十六进制)

上一篇:atom添加eslint插件


下一篇:ab压力测试报错: apr_socket_recv: Connection reset by peer (104)