以下面的例子为例,探寻printf函数的输出。
#include<stdio.h>
void convert(int* a, int* b, int** c)
{
int* d = a;
*d = 101;
b = d;
*c = d;
}
int main()
{
int a = 1;
int b = 2;
int c = 3;
int* p = &c;
convert(&a, &b, &p);
printf("%d %d %d %d", a, b, c, *p);
return 0;
}
main函数中有int型变量a、b、c以及指针p,这些是全局变量,是在静态存储区分配空间储存的,假设它们的地址空间为0x01,0x02,0x03,0x04。而接下来进行函数调用,分别将a、b以及指针p的地址入参。
接下来在栈中给变量分配空间,假设给指针a分配的空间为0x10,0x10中存放的数据为main函数中a的地址0x01,同理,指针b地址为0x11,存放的数据为main函数中b的地址0x02,而双重指针c的地址为0x12,其中存放的是指针p的地址0x04,这里用一个图来说明双重指针c的情况。
covert函数中,初始化了指针d等于指针a,指针d的地址空间为0x13,其中内容为0x01。再然后让d = 101,即是让0x01中的内容变为101。又让b = d,也就是指针b中存放的地址为0x01,但这对main函数中变量b没有影响,因为其地址空间0x02中的值没有改变。而让c = d,即是让0x04中的地址变成d的地址,即0x01,也就是让main函数中的指针p指向了0x01地址空间。
综上所述,可以得到答案如下。