1、下面程序输出结果为多少(在32位和64位操作系统上分别是多少?
struct st_t
{
int status;
short *pdata;
char errstr[32];
};
int main(int argc, const char *argv[])
{
struct st_t st[16];
char *p = (char *)( st[2].errstr + 32);
printf("%d", p - (char *)(st));
}
答
32位:120
64位:144
注:其实就是求3个结构体st_t的大小
2、下面程序的输出结果
struct HAR
{
int x;
int y;
struct HAR *p;
}h[2]
int main(int argc, const char *argv[])
{
h[0].x = 1;
h[0].y = 2;
h[1].x = 3;
h[1].y = 4;
h[0].p = &h[1];
h[1].p = h;
printf("%d %d\n", (h[0].p)->x, (h[1].p)->y);
}
答
3 2
3、下面程序的结果是多少?
void fun(int *s)
{
static int i = 0;
do{
s[i] += s[i+1];
}while(++i < 2);
}
int main(int argc, const char *argv[])
{
int k;
int a[10] = {1, 2, 3, 4, 5};
for(k=1; k<3; k++)
fun(a);
for(k=0; k<5; k++)
printf("%d", a[k]);
return 0;
}
答
3 5 7 4 5
4、已知二维数组是int a[m][n],试用数组指针和一级指针分别表示a[i][j],并思考二级指针如何表示a[i][j]。
int a[3][3] = {1,2,3,4,5,6,7,8,9};
int (*p)[3] = a; //指针数组
int *p1 = a[0]; //一级指针
int **p2 = &p1; //二级指针,二级指针不能直接指向数组,可用一级指针当桥梁
//输出a[2][1] = 8
printf("%d\n",*(p[2] + 1));
printf("%d\n",*(*(p+2) + 1));
printf("%d\n",p[2][1]);
printf("%d\n",*(p1 + 2 * 3 + 1));
printf("%d\n",*(*p2 + 2 * 3 + 1));
return 0;