请帮忙解释:
#include <stdio.h>
void g(int**p)
{
(**p)++;
(*p)++;
}
int main(int argc, char *argv[])
{
int line[10], i;
int *p= line;
for(i=0; i< 10; i++){
*p=i;
g(&p);
}
for(i=0;i<10;i++)
printf("%d\n", line[i]);
return 0;
}
为什么输出结果为:
1
2
3
4
5
6
7
8
9
10
这也没什么吧, line[0] = 0, 然后在g函数里, line[0] 被++, 同时这个p向前 指向了 line[1], 然后line[1] =1, 在g函数里, line[1] 被++, 同时这个p向前 指向了 line[2],...
这个很显然嘛,就是指针的操作
int *p = line; 表示p指针指向line 数组的第一个元素
先通过p指针对line中的元素初始化,然后调用g(int **p)函数就是先将p指向原来指向的line里面的元素的后一个,然后对这个元素加一
大概就是这样,可能我所表述的也不是很清楚,你去多看看指针就行了
首先你要理解什么是一级指针,什么是二级指针
一级指针储存的就是某个变量的地址
而二级指针就是存储一级指针的地址
假设定义一个二级指针
int a = 5;
int *p = &a;
int **pp = &p;
解引一次
*pp
是指向一级指针的地址,即*pp
和&p
是等价的
解引两次
**pp
是一个变量的值,即**p
和a
是等价的
那么我们来看一下你的程序
*p=i;
g(&p);
第一次执行的时候p
是指向line[0]
的地址
所以第一个语句等价line[0]=0;
然后是执行g(&p)
这一句就相当于把p
的地址传给g()
函数,所以g()
函数使用了一个二级指针来接受这个变量
最后看一下g()
函数
void g(int**p)
{
(**p)++;
(*p)++;
}
开始已经说了**p
是指向变量的值
所以第一句等价line[0]++;
即line[0]
的值变为1
而*p
是指向一级指针的地址
这一句就等价于p++
,那么这时候p
就变成指向line[1]
的地址了
以上一轮结束以后
再次进入main()
函数里面的for
循环
就等价(第二次执行for循环里面的语句)
line[1]=1;
g(&line[1]);
就是这样子一直循环10遍
所以最后打印的结果是1至10