标题:新手对指针的理解 . . 需要一个权威的鉴定(已经得到过肯定, 但不是权威)
只看楼主
sainimu78
Rank: 2
等 级:论坛游民
帖 子:57
专家分:26
注 册:2010-1-27
结帖率:100%
已结贴  问题点数:16 回复次数:10 
新手对指针的理解 . . 需要一个权威的鉴定(已经得到过肯定, 但不是权威)
typedef struct
{
int integer;
int *point;
}abc;

void init(abc **e)   /*要用二级指针才能存住传入的指针的地址*/
{
int b=2;
*e=(abc*)malloc(sizeof(abc));/*因为这个函数是要给形参一个新的地址 改的是指针实参指向的地址*/
(*e)->point=&b;             /*所以要用二级指针来存指针实参的地址*/

}

void function(abc *c) /*这里修改的是传入的指针所存的地址*/
{
int d=5;
c->point=&d;
}



main()
{
abc *a;   /*新定义的指针都指向一个地址*/
init(&a)  ;   /*把指针的地址传入*/
function(a);  /*把指针a里的地址传入*/
printf("%d",*a->point);
getch();
}

上面注释里说的 都对么~?
另外还一个问题

void init(abc **e)  
{
int b=2;
*e=(abc*)malloc(sizeof(abc));
(*e)->point=&b;            
}
为啥e前面要加一个星号?~
*e=(abc*)malloc(sizeof(abc));
(*e)->point=&b;
搜索更多相关主题的帖子: 权威 指针 鉴定 
2010-04-04 23:46
hanzhenddd
Rank: 5Rank: 5
等 级:职业侠客
帖 子:90
专家分:361
注 册:2010-3-4
得分:4 
看起来没什么错误.... 不要搞的太复杂  就一句话.  一维指针和 一维数组对应,二维指针和 二维数组对应..

void init(abc **e)  
{
int b=2;
*e=(abc*)malloc(sizeof(abc));
(*e)->point=&b;            
}
为啥e前面要加一个星号?~
*e=(abc*)malloc(sizeof(abc));
(*e)->point=&b;


因为相对于**e来说,*e就是它的地址!
2010-04-04 23:55
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
得分:4 
init(&a)  ;   /*把指针的地址传入*/
function(a);  /*把指针a里的地址传入*/

你还能告诉我,为什么,第1个函数你要设计成传入地址的地址.

而第二个却只设计成传入地址?

从功能上看,这两个函数都是对该 结构体对象指针进行操作。

在什么情况下要设计成传入地址的地址,什么情况下却不要。

我觉得,你也许发现要把第1个设计传入2级地址,却不明白为什么第2个不要设计成2级地址.


程序代码:
#include<stdio.h>
#include<malloc.h>
typedef struct
{
    int integer;
    int *point;
}abc;

void init(abc *e)   /*要用二级指针才能存住传入的指针的地址*/
{
    int b=2;
    //*e=(abc*)malloc(sizeof(abc));/*因为这个函数是要给形参一个新的地址 改的是指针实参指向的地址*/
    //(*e)->point=&b;             /*所以要用二级指针来存指针实参的地址*/
    e->point=&b;
}

void function(abc *c) /*这里修改的是传入的指针所存的地址*/
{
    int d=5;
    c->point=&d;
}

int main()
{
    abc *a=(abc *)malloc(sizeof(abc));   /*新定义的指针都指向一个地址*/
    init(a)  ;   /*把指针的地址传入*/
    function(a);  /*把指针a里的地址传入*/
    printf("%d",*a->point);
    getchar();
}


你会发现,我这么写,完全也可以不要传入2级指针.

ps :你运气好,我今天心情好,多点拨你点。

[ 本帖最后由 Devil_W 于 2010-4-5 00:27 编辑 ]
收到的鲜花
  • pgy2010-04-05 07:15 送鲜花  10朵   附言:O(∩_∩)O哈哈~
2010-04-05 00:18
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
得分:4 
坐等权威
2010-04-05 08:13
sainimu78
Rank: 2
等 级:论坛游民
帖 子:57
专家分:26
注 册:2010-1-27
得分:0 
以下是引用Devil_W在2010-4-5 00:18:01的发言:

init(&a)  ;   /*把指针的地址传入*/
function(a);  /*把指针a里的地址传入*/
 
你还能告诉我,为什么,第1个函数你要设计成传入地址的地址.
 
而第二个却只设计成传入地址?
 
从功能上看,这两个函数都是对该 结构体对象指针进行操作。
 
在什么情况下要设计成传入地址的地址,什么情况下却不要。
 
我觉得,你也许发现要把第1个设计传入2级地址,却不明白为什么第2个不要设计成2级地址.
 
 
#include
#include
typedef struct
{
    int integer;
    int *point;
}abc;
 
void init(abc *e)   /*要用二级指针才能存住传入的指针的地址*/
{
    int b=2;
    //*e=(abc*)malloc(sizeof(abc));/*因为这个函数是要给形参一个新的地址 改的是指针实参指向的地址*/
    //(*e)->point=&b;             /*所以要用二级指针来存指针实参的地址*/
    e->point=&b;
}
 
void function(abc *c) /*这里修改的是传入的指针所存的地址*/
{
    int d=5;
    c->point=&d;
}
 
int main()
{
    abc *a=(abc *)malloc(sizeof(abc));   /*新定义的指针都指向一个地址*/
    init(a)  ;   /*把指针的地址传入*/
    function(a);  /*把指针a里的地址传入*/
    printf("%d",*a->point);
    getchar();
}
 
你会发现,我这么写,完全也可以不要传入2级指针.
 
ps :你运气好,我今天心情好,多点拨你点。
很感谢你的点拔
init里没有要改变a指向的地址的操作
当然不用传入指针的地址


[ 本帖最后由 sainimu78 于 2010-4-5 11:03 编辑 ]
2010-04-05 10:46
sainimu78
Rank: 2
等 级:论坛游民
帖 子:57
专家分:26
注 册:2010-1-27
得分:0 
回复 楼主 sainimu78
程序代码:
main()    /*指针只存地址*/
{
int *a,b,**c;
b=2;
a=&b;
c=&a;
printf("int *a,b=2,**c\n\n");
printf("&a=%d         &b=%d    &c=%d\n",&a,&b,&c);
printf("a=&b,&a=%d              c=&a,&c=%d\n",&a,&c);
printf("&*a=%d                  &*c=%d\n",&*a,&*c);
printf("                    c=%d     **c=%d *c=%d &**c=%d\n",c,**c,*c,&**c);
getch();
}

/*
------------------------
|              b=2;    |
|             ↑       |
|        a[b的地址]    |   指针能存变量的地址,通过地址找到对应的变量
|      ↑              |
| c[a的地址]           |   二级指针能存指针变量的地址 反正指针就是存地址 通过地址找到对应的变量
------------------------
从代码中的赋值运算可以看出来 c代表了a的地址(c与&a 等价)

把变量用变量所存的内容替换.再通过地址找对应的变量
以下=号不是赋值运算 而是数学里的等值运算
*c *取内容符 运算顺序右至左
看成 *(c)
先代换 : c=&a -> *(c)=*(&a)
通过&a找到a (每通过地址找对应的变量都要用掉一个*号----取内容符嘛!顾名思义 取了一次就运算完了 自然就要消掉咯 )
把a代换 a=&b    所以 得到 (&b)
没*号了 结果也就出来了 结果就是取到b的地址了

**c
看成 {*[*(c)]}
代换 : c=&a -> {*[*(&a)]}
通过&a找到a
再代换 : a=&b -> {*[(&b)]}
通过&b找到b
代换 : b=2 ->{[(2)]}

*/
现在就能解释为啥要加*号了
.

以*e=(abc*)malloc(sizeof(abc));这句为例
以下=号不是赋值运算 而是数学里的等值运算
init(&a); 传入指针a所在的地址
init(**e);用二级指针来存住这个地址
根据上面的理论 e=&a;
*e 看成 *(e) 开始算
先代换 : e=&a -> *(e)=*(&a)
消* 通过&a找到a
再代换 : a=(未知地址) 可得 (未知地址)

然后回代一下 可发现
a=*&a=*e
即*e=a;
这样*e=(abc*)malloc(sizeof(abc));就相当于是 a=(abc*)malloc(sizeof(abc));
也就跟直接用一样
2010-04-05 16:29
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
得分:0 
回复 6楼 sainimu78
我还是觉得,你没说到点子上。


2010-04-05 17:10
sainimu78
Rank: 2
等 级:论坛游民
帖 子:57
专家分:26
注 册:2010-1-27
得分:0 
那我这么理解怎样... 看看

由于init函数里 要改传入的a指向的地址
malloc返回的是内存首地址的指针
所以需要一个指针来存这个地址
指针之间才能互相赋值嘛~!

如果不是要在自定义函数里改a指向的地址
那么只要 a=(abc*)malloc(sizeof(abc))
但现在是要在自定义函数里实现修改a指向的地址
所以需要 init(**e) 定义一个二级指针 来存a指针所在的地址 通过这个地址来找到指针a
由我的那个什么理论 得出 a=*e
所以在 init()里实现修改a指向的地址
只要 *e=(abc*)malloc(sizeof(abc))


[ 本帖最后由 sainimu78 于 2010-4-5 18:52 编辑 ]
2010-04-05 18:48
ggvvcc
Rank: 3Rank: 3
来 自:山东临沂
等 级:论坛游侠
帖 子:50
专家分:119
注 册:2010-4-3
得分:4 
#include <stdio.h>

int main()
{
    int x = 10;
    int *px = &x;
    int **ppx = &px;

    printf("%d\n", x);
    printf("%d\n", &x);
    printf("%d\n", px);
    printf("%d\n", *ppx);
    printf("%d\n", &px);
    printf("%d\n", ppx);


    return 0;
}
试试这个,主要是对指针加深理解,**p为指针的指针,即指针变量的地址,指针虽然可以存储其他变量的地址,但它本身也占用内存,也有自己的内存地址。
2010-04-05 19:40
sainimu78
Rank: 2
等 级:论坛游民
帖 子:57
专家分:26
注 册:2010-1-27
得分:0 
以下是引用ggvvcc在2010-4-5 19:40:56的发言:

#include

int main()
{
    int x = 10;
    int *px = &x;
    int **ppx = &px;

    printf("%d\n", x);
    printf("%d\n", &x);
    printf("%d\n", px);
    printf("%d\n", *ppx);
    printf("%d\n", &px);
    printf("%d\n", ppx);


    return 0;
}
试试这个,主要是对指针加深理解,**p为指针的指针,即指针变量的地址,指针虽然可以存储其他变量的地址,但它本身也占用内存,也有自己的内存地址。
恩 我和你想法是一样的
2010-04-05 19:46



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-301697-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.364859 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved