谁给解释一下,速度!在线给分

sayigood 2009-06-03 09:38:57
void g(int**);
int main()
{
int line[10],i;
int *p=line; //p是地址的地址
for (i=0;i<10;i++)
{
*p=i;
g(&p);//数组对应的值加1
}
for(ii=0;ii<10;ii++)
printf('%d\n',line[ii]);
return 0;
}
void g(int**p)
{
(**p)++;
(*p)++;// 无效
}
...全文
265 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
joyan 2009-06-03
  • 打赏
  • 举报
回复
我来看看结贴后再回复的
draculamx 2009-06-03
  • 打赏
  • 举报
回复
int *p = line; //p是地址的地址?? 楼主这里理解错误

这行代码说的是:P是指向 line 这个数组的第一个元素的地址,是一个一级指针,而不是指向“地址的地址”的二级指针
「已注销」 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 BenjaminHuang 的回复:]
**x 等价于 *p, 所以 (**x)++ 对当前 p 指向的数组元素加1
而(*x)++ 操作的是 p 的指针值,让它指向数组的下一个元素。 [/Quote]
明白了。
kernelshell 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 sayigood 的回复:]
引用 22 楼 hairetz 的回复:
引用 18 楼 sayigood 的回复:
谁明白啊?继续讨论(拒绝帮顶)


我在9楼那句,你看明白了吗?

void g(int**p)
{
(**p)++; //如果g(&p);//只是p[i]++操作而已。i是根据(*p)++;的次数判断
(*p)++; //有效
}
你能再解释一下 *p = i;中的*p是数组元素,还是数组元素的地址吗?
[/Quote]
*p就是输送族元素阿。至少对于你这个题是这样的。对别的题不一定是。我写的那个也很清楚了阿。这个题根本没用到双**,你可以让高人写一个用双**的例子。对于你这个题目,随便发挥的。对比,你就明白了。我感觉你是明白基础的东西。但就是被**弄糊涂了。
至善者善之敌 2009-06-03
  • 打赏
  • 举报
回复
楼主去看书好了,指针数组那章讲的很明白
BenjaminHuang 2009-06-03
  • 打赏
  • 举报
回复
for (i = 0;i < 10;i++)
{
*p = i;//谁能解释一下这里?这里不是相当于给&line[i]赋值吗?
g(&p);//数组对应的值加1
}

p是指针,指向数组中的第一个元素,那*p当然是对数组的第一个元素进行操作,等价于 line[i] = i;
函数的形参命名也是p,但是千万不要搞混了,建议重新命名(以下我用x表示区分)。

在函数里 x 是一个指针,指向 main 函数里 p 这个指针变量的存储空间,

**x 等价于 *p, 所以 (**x)++ 对当前 p 指向的数组元素加1
而(*x)++ 操作的是 p 的指针值,让它指向数组的下一个元素。
sayigood 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 hairetz 的回复:]
引用 18 楼 sayigood 的回复:
谁明白啊?继续讨论(拒绝帮顶)


我在9楼那句,你看明白了吗?

void g(int**p)
{
    (**p)++;  //如果g(&p);//只是p[i]++操作而已。i是根据(*p)++;的次数判断
    (*p)++; //有效
}
[/Quote]你能再解释一下 *p = i;中的*p是数组元素,还是数组元素的地址吗?
光宇广贞 2009-06-03
  • 打赏
  • 举报
回复
楼主你想问什么?你想得到什么结果?你这么不明不白地问有什么用?
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sayigood 的回复:]
谁明白啊?继续讨论(拒绝帮顶)
[/Quote]

我在9楼那句,你看明白了吗?

void g(int**p)
{
(**p)++; //如果g(&p);//只是p[i]++操作而已。i是根据(*p)++;的次数判断
(*p)++; //有效
}
kernelshell 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 supermegaboy 的回复:]
引用 5 楼 sayigood 的回复:
for (i = 0;i < 10;i++)
{
*p = i;//谁能解释一下这里?这里不是相当于给&line[i]赋值吗?
g(&p);//数组对应的值加1
}


不是,只相当于赋值给line[0].
[/Quote]
不要被前面的声明g(**)给弄糊涂了,想知道*P是什么意思就看“int *p = line; //p是地址的地址”这个就知道了。p指向数组首地址,那么*p就是指向数组第一个下标为零的元素。后面的语句用来改变指针变量,以便于指向不同的地址,否则,*p的值总是被复制值覆盖掉。双**还没看到具体是什么用,就是没有体现地址的地址的应用。
kernelshell 2009-06-03
  • 打赏
  • 举报
回复
#include <stdio.h>

void g(int**);
int main()
{
int line[10]={0}, i=8;
int *p = line; //p是地址的地址
for (i = 0; i < 10; i++)
{
*p = i;//就是line[0] = i
g(&p);//数组对应的值加1
}
printf("%d\n\n",line[0]);
for (int ii = 0;ii < 10;ii++)
printf("%d\n", line[ii]);
return 0;
}
void g(int**p)
{
//(**p)++;//无效
(*p)++; //有效
}
kernelshell 2009-06-03
  • 打赏
  • 举报
回复
我不明白,我帮你鼎,我也学习学习。大树底下好乘凉。
sayigood 2009-06-03
  • 打赏
  • 举报
回复
谁明白啊?继续讨论(拒绝帮顶)
「已注销」 2009-06-03
  • 打赏
  • 举报
回复
楼主看看这个例子,输出2,可能就比我还明白了:
#include   <iostream>
using namespace std;
void func(int **p)
{
int a = 2;
*p = &a;
}

int main()
{
int m = 1;
int *q = &m;
func(&q);
cout << *q;
return 1;
}
「已注销」 2009-06-03
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <windows.h>

void g(int**);
int main()
{
int line[10] = { 0}, i;
int *p = line; //p是地址的地址
for (i = 0;i < 10;i++)
{
*p = i;
g(&p);//数组对应的值加1
}
for (int ii = 0;ii < 10;ii++)
printf("%d\n", line[ii]);
return 0;
}
void g(int**p)
{
(**p) += 10;// 无效
(*p)++;
printf("1: 0x%x - 0x%x \n", *p, p);
}

输出:
1: 0x12ff3c - 0x12ff68
1: 0x12ff40 - 0x12ff68
1: 0x12ff44 - 0x12ff68
1: 0x12ff48 - 0x12ff68
1: 0x12ff4c - 0x12ff68
1: 0x12ff50 - 0x12ff68
1: 0x12ff54 - 0x12ff68
1: 0x12ff58 - 0x12ff68
1: 0x12ff5c - 0x12ff68
1: 0x12ff60 - 0x12ff68
10
11
12
13
14
15
16
17
18
19

看来我还是对指针的指针不明白!
sayigood 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Loaden 的回复:]
int *p = line; //p是地址的地址
    for (i = 0;i < 10;i++)
    {
        *p = i;//谁能解释一下这里?这里不是相当于给&line[i]赋值吗?
        g(&p);//数组对应的值加1
    }

不是给&line[i],而是给&line[0]
[/Quote]第一次循环的时候,的确是&line[0]。那么给&line[0]赋值就对了吗?
zbihong 2009-06-03
  • 打赏
  • 举报
回复
顶一下!!!!
「已注销」 2009-06-03
  • 打赏
  • 举报
回复
所以值的改变是依靠:
void g(int**p)
{
(**p)++;
(*p)++;// 无效
}
没明白是怎么回事,等着看结论。
飞天御剑流 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sayigood 的回复:]
for (i = 0;i < 10;i++)
{
*p = i;//谁能解释一下这里?这里不是相当于给&line[i]赋值吗?
g(&p);//数组对应的值加1
}
[/Quote]

不是,只相当于赋值给line[0].
fairchild811 2009-06-03
  • 打赏
  • 举报
回复
不是很明白lz的意思
加载更多回复(11)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧