📅  最后修改于: 2023-12-03 14:58:27.003000             🧑  作者: Mango
该题目是GATE(计算机科学与信息技术工程门考试)的题目,目的是测试程序员的编程能力和理解力。以下是该题目的介绍和解答,详细说明了问题和解决方案。
题目: 考虑以下C语言代码片段:
#include<stdio.h>
int main(){
int a[]={0,1,2,3,4};
int *p[]={a,a+1,a+2,a+3,a+4};
printf("%d %d %d ", p, *p, **p);
p++;
printf("%d %d %d ", p, *p, **p);
*p++;
printf("%d %d %d ", p, *p, **p);
++*p;
printf("%d %d %d\n", p, *p, **p);
return 0;
}
问题: 上述程序的输出是什么?
解答: 按照顺序解析代码片段中的各个语句和操作:
int a[]={0,1,2,3,4};
- 创建了一个整型数组a,并初始化为{0,1,2,3,4}。int *p[]={a,a+1,a+2,a+3,a+4};
- 创建了一个整型指针数组p,每个元素指向数组a的一个元素。printf("%d %d %d ", p, *p, **p);
- 打印了p、*p和**p的值,即p指向的数组a的地址、指针p的第一个元素的值(即a[0])以及a[0]的值。p++;
- 指针p后移一个元素,指向a[1]。printf("%d %d %d ", p, *p, **p);
- 再次打印p、*p和**p的值,此时p指向a[1]。*p++;
- 给p指向的元素加一(即a[1]的值加一)。printf("%d %d %d ", p, *p, **p);
- 再次打印p、*p和**p的值,此时p仍然指向a[1]。++*p;
- 给指针p的值加一(即p指向的元素a[1]的值加一)。printf("%d %d %d\n", p, *p, **p);
- 最后一次打印p、*p和**p的值,此时p仍然指向a[1]。因此,上述程序的输出将是:
<地址> <a数组第一个元素的值> <a数组第一个元素的值>
<地址> <a数组第二个元素的值> <a数组第二个元素的值>
<地址> <a数组第二个元素的值+1> <a数组第二个元素的值+1>
<地址> <a数组第二个元素的值+2> <a数组第二个元素的值+2>
请注意,这里的<地址>
是指一个内存地址,每次运行程序时都会不同。
以上是对'门| GATE-CS-2006 |第 61 题'的介绍和解答。