程序分析题
1、下面程序的运行结果是什么?
#include <stdio.h>
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));
return 0;
}
2、下面程序的运行结果是什么?
#include <stdio.h>
int main()
{
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
int *p;
p = a[0];
printf( "%d", p[0]);
return 0;
}
3、下面程序的运行结果是什么?
#include <stdio.h>
int main()
{
char *a[] = {"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
答案:
1.
解析:a表示首元素地址,a+1表示第二个元素地址,*(a+1)表示第二个元素2;
&a是整个数组地址,&a+1表示跳过整个数组,指向数组后面的地址,(int *)(&a + 1)表示将(&a + 1)强制转换为整型指针,ptr为整型指针,里面放着5后面的地址,ptr是整型指针,所以ptr-1表示向后跳过四个字节,*(ptr - 1)表示解引用四个字节,即数字5
答案:2,5
2、
解析:二维数组里面元素实际为逗号表达式,相当于int a[3][2]={1,3,5},a[0]为第一行数组名,表示首元素地址,p里面为1的地址,p[0]==*(p+0)。
答案:1
3.
解析:常量字符串作为表达式时,它的值是字符首元素的地址,a为指针数组数组名,表示'w'的地址的地址,pa++表示跳过一个char*的地址,即'a'的地址的地址,*pa表示'a'的地址,打印结果at。
答案:at