本文针对C语言基础5指针专题一和C语言基础6指针专题二字符指针与字符串的内容进行了补充,将会持续更新一下笔试题:
题1:以下程序执行结果?
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[5] = {1, 2, 3, 4, 5};
int *ptr1 = (int *)(&a + 1);
printf("%d,%d\n",*(a+1),*(ptr1-1));
return 0;
}
解答:2,5
数组名是数组首地址,数组名是一个地址常量。*(a+1)是2
&a+1是数组整体地址的下一个地址,用了一个二维数组的思想。ptr是(int *),ptr-1就是指向的a[4]位置。
题2:以下程序执行结果?
#include <stdio.h>
int main(int argc, const char *argv[])
{
int aa[2][5] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *ptr1 = (int *)(&aa + 1);
int *ptr2 = (int *)(*(aa + 1));
printf("%d,%d\n",*(ptr1-1),*(ptr2-1));
return 0;
}
解答:10,5
数组名是数组首地址,数组名是一个地址常量,虽然不能修改,但是可以取地址操作。aa[2][5] 2行5列,ptr1 是10 后面一个地址,所以prr1-1的值是10。aa+1是行地址移动,*(aa+1)是把aa降为列地址,ptr2 是指向的6,往前一个,是列地址往前一个指向5。
题3:以下程序执行结果?
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[4] = {1, 2, 3, 4};
int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a + 1);
printf("%#x,%#x\n",ptr1[-1],*ptr2);
return 0;
}
解答:0x4,0x00000002
题4:以下程序执行结果?
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[3][2] = {(0, 1),(2, 3),(4, 5)};
int *p;
p = a[0];
printf("%d\n",p[1]);
return 0;
}
解答:3