请教一个c语言指针的题目
请帮忙解释:
#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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这也没什么吧, line[0] = 0, 然后在g函数里, line[0] 被++, 同时这个p向前 指向了 line[1], 然后line[1] =1, 在g函数里, line[1] 被++, 同时这个p向前 指向了 line[2],...
首先你要理解什么是一级指针,什么是二级指针
一级指针储存的就是某个变量的地址
而二级指针就是存储一级指针的地址
假设定义一个二级指针
解引一次
是指向一级指针的地址,即
*pp
和&p
是等价的解引两次
是一个变量的值,即
**p
和a
是等价的那么我们来看一下你的程序
第一次执行的时候
p
是指向line[0]
的地址所以第一个语句等价
line[0]=0;
然后是执行
g(&p)
这一句就相当于把
p
的地址传给g()
函数,所以g()
函数使用了一个二级指针来接受这个变量最后看一下
g()
函数开始已经说了
**p
是指向变量的值所以第一句等价
line[0]++;
即line[0]
的值变为1
而
*p
是指向一级指针的地址这一句就等价于
p++
,那么这时候p
就变成指向line[1]
的地址了以上一轮结束以后
再次进入
main()
函数里面的for
循环就等价(第二次执行for循环里面的语句)
就是这样子一直循环10遍
所以最后打印的结果是1至10
这个很显然嘛,就是指针的操作
int *p = line; 表示p指针指向line 数组的第一个元素
先通过p指针对line中的元素初始化,然后调用g(int **p)函数就是先将p指向原来指向的line里面的元素的后一个,然后对这个元素加一
大概就是这样,可能我所表述的也不是很清楚,你去多看看指针就行了