首页 > 请教一个c语言指针的题目

请教一个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

这也没什么吧, 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

是一个变量的值,即**pa是等价的

那么我们来看一下你的程序

 *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

【热门文章】
【热门文章】