请教一道C语言题:下面的程序运行结果为什么是24谢谢!

来源:百度知道 编辑:UC知道 时间:2024/05/27 16:40:53
main()
{
int a[5]={2,4,6,8,10},*p,**k;
p=a;k=&p;
printf("%d",*(p++));
printf("%d\n",**k);
}

首先要明白a是个数组,是数组名,也是数组首地址,指针p,k指向如下图
数组 a : k —> p —> a[0] —— 2
a[1] —— 4
a[2] —— 6
a[3] —— 8
a[4] —— 10
第一条输出: *(p++) 中++在后面,先计算出 *p=2 并输出2, 再指针p++,就是指针往下移一位;而k是指向p的,并不是直接指向a,所以k指针也会跟着p一起移动。得到:

数组 a : a[0] —— 2
k —> p —> a[1] —— 4
a[2] —— 6
a[3] —— 8
a[4] —— 10

那么此时,第一条输出语句才算执行完,然后执行下一条输出,输出**k; 此时p指针指向的是a[1],即得到 p=&a[1]; 再运用*与&是一对互逆运算,所以有:**k = **(&p) = *p = *(&a[1]) =a[1]=4
〔代入k] [右结合,*与&互逆,*(&p)==p〕 〔同理〕
所以第二次输出4。

所以最后的输出结果是24;明白没?

p=a;表示p指向数组的首地址&a[0];
*(p++)表示先取p所指地址的值,即a[0]的值2;再让p向右移1步,即指向&a[1];
k=&p; 表示k指向p的地址;
**k;表示输出p所指的地址的值即4.

这与++的结合性有关
++右结合
如果printf("%d",*(p++)); 是printf("%d",*(++p));