📜  门| GATE-CS-2006 |第 61 题(1)

📅  最后修改于: 2023-12-03 14:58:27.003000             🧑  作者: Mango

门| GATE-CS-2006 |第 61 题

该题目是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;
}

问题: 上述程序的输出是什么?

解答: 按照顺序解析代码片段中的各个语句和操作:

  1. int a[]={0,1,2,3,4}; - 创建了一个整型数组a,并初始化为{0,1,2,3,4}。
  2. int *p[]={a,a+1,a+2,a+3,a+4}; - 创建了一个整型指针数组p,每个元素指向数组a的一个元素。
  3. printf("%d %d %d ", p, *p, **p); - 打印了p、*p和**p的值,即p指向的数组a的地址、指针p的第一个元素的值(即a[0])以及a[0]的值。
  4. p++; - 指针p后移一个元素,指向a[1]。
  5. printf("%d %d %d ", p, *p, **p); - 再次打印p、*p和**p的值,此时p指向a[1]。
  6. *p++; - 给p指向的元素加一(即a[1]的值加一)。
  7. printf("%d %d %d ", p, *p, **p); - 再次打印p、*p和**p的值,此时p仍然指向a[1]。
  8. ++*p; - 给指针p的值加一(即p指向的元素a[1]的值加一)。
  9. 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 题'的介绍和解答。