C语言高手麻烦能进来帮帮我,谢谢您了

来源:百度知道 编辑:UC知道 时间:2024/05/17 04:41:41
若有定义和语句
static int a[3]={10,20,30};
int **pp,*p;
p=a;pp=&p;
(pp[0]++)[1]+=5;
printf(“%d,%d,%d\n”,**pp,*p,a[0]);

麻烦请详细解释一下
(pp[0]++)[1]+=5; 的执行过程 谢谢

除了a已经分配空间 a和p是一回事 而pp是个指向a的指针

你的原程序可以看做
#include<stdio.h>
void main()
{
int a[3]={10,20,30};
int **pp,*p;
int* dd;
p=a;pp=&p;
dd=(pp[0]++);
dd[1]+=5;
printf("%d,%d,%d\n",**pp,*p,a[0]);
}

这样便于理解;
你的输出里**pp 和*p也是一回事

pp[0]++;按照++法则 pp[0]先给了dd再去自加;
所以dd是指向a[0];然后pp[0]自加使pp指向a[1];
dd[1]+=5;由于dd指向a[0] 所以dd[1]指向a[1], 所以a[1]=20+5=25;
输出a[1] 结果是25 ,25,10

你可以试试看 (++pp[0])[1]+=5的情况 此时a[2]会变成35

pp[0]就相当于*p,其实就是取pp中的值,其实也就是指针p,从而pp[0]++就相当于p++,原来p是等于a的,pp[0]++就相当于先取p的值,然后再把p自增1,那么p现在就指向a[1]了,所以**pp==*p==a[1]。

1、按照等级来,先pp[0];
2、由于++在pp[0]后面,所以先取(pp[0])[1]+=5;再让pp[0]++;
(1)之前使pp=&p;然pp[0]对pp进行了指针降级,pp[0]就是p;
(2)(pp[0])[1]就是p[1];所以是p[1]+=5;再让p++;

**pp为指向指针的指针,而指针p指向数组a的首地址即&a[0],pp[0]指向指针p从而指向地址&a[0],pp[0]++后,pp指向地址&a[1],则(pp[0]++)[1]=a[1]=10,(pp[0]++)[1]+=5相当于,(pp[0]++)[1]=(pp[0]++)[1]+5,执行该语句后,(pp[0]++)[1]=25,最后输出结果为:25