LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2349|回复: 15

对C语言的指针又有一点糊涂了[已解决]

[复制链接]
发表于 2006-8-3 00:57:59 | 显示全部楼层 |阅读模式
比如我写一段代码如下:

void assign(int* a)
{
        int* p;
        p=(int*)malloc(sizeof(int));
        *p=12;
        a=p;
}


int main()
{
        int *a=NULL;
        assign(a);
        printf("%d",*a);
}
为什么不能如此赋值?

昨天确实有点犯傻了,看到大家这么热情,还是得谢谢大家。
gvlr的程序是正确的,Lolita的解答也很耐心详细,ooio_karl和mech的一样,容易导致段错误。

c语言的指针里面的内容就是一个地址值而已。参数为指针时,传递的是这个地址的一个拷贝。因此,这个指针的内容(地址值)是不会变的,但是可以在子函数里改变他所指的地址的内容,相当于汇编的间接寻址;要想在子函数里改变指针,只能传递指向指针的指针。


其实,我是在一个链表程序里犯下这样的错误的:将链表的头指针传到一个子函数中去,我在子函数中改了链表的头指针,以为链表会发生变化,在主函数里发现没有任何效果,正确做法和gvlr一样,应该传递指向链表结构体的指针的指针。
发表于 2006-8-3 03:33:04 | 显示全部楼层
a,p 是地址

*p 才是内容
回复 支持 反对

使用道具 举报

发表于 2006-8-3 06:55:14 | 显示全部楼层
void assign(int* a)
{
。。。
}
形参a在该函数中只是实参的一个拷贝体,对拷贝体进行的赋值动作当然没办法影响本体。
回复 支持 反对

使用道具 举报

发表于 2006-8-3 09:35:33 | 显示全部楼层
比如我写一段代码如下:

void assign(int* a)
{
        int* p;
        p=(int*)malloc(sizeof(int));
        *p=12;
        a=p;     ===>*a=*p;
}


int main()
{
        int *a=NULL;
        assign(a);
        printf("%d",*a);
}
回复 支持 反对

使用道具 举报

发表于 2006-8-3 12:25:19 | 显示全部楼层
Post by ooio_karl
比如我写一段代码如下:

void assign(int* a)
{
        int* p;
        p=(int*)malloc(sizeof(int));
        *p=12;
        a=p;    [color="Red"] ===>*a=*p;
}




红色代码容易导致段错误
回复 支持 反对

使用道具 举报

发表于 2006-8-3 15:00:45 | 显示全部楼层
这样写就能编译通过了,而且输出是12
      1 #include<stdio.h>
      2 #include<stdlib.h>
      3
      4 void assign(int * *);
      5 main()
      6 {
      7 int *a=NULL;
      8 assign(&a);
      9 printf("%d",*a);
     10 }
     11
     12 void assign(int * *a)
     13 {
     14 int  *p;
     15 p=malloc(sizeof(int *));
     16 *p=12;
     17 *a=p;
     18 }
我的系统
linux fc5
赛扬1.7G
256MB内存
Geforce MX400显卡
回复 支持 反对

使用道具 举报

发表于 2006-8-3 19:25:54 | 显示全部楼层
void assign(int* a)
{
int* p;
p=(int*)malloc(sizeof(int));
*p=12;
*a=*p;
}


int main()
{
int *a=NULL;
assign(a);
printf("%d",*a);
}

这样应该可以吧
回复 支持 反对

使用道具 举报

发表于 2006-8-3 19:29:22 | 显示全部楼层
Post by mech
void assign(int* a)
{
int* p;
p=(int*)malloc(sizeof(int));
*p=12;
*a=*p;
}


int main()
{
int *a=NULL;
assign(a);
printf("%d",*a);
}

这样应该可以吧


你最好试试看再说
回复 支持 反对

使用道具 举报

发表于 2006-8-3 20:58:19 | 显示全部楼层
Post by mech
void assign(int* a)
{
int* p;
p=(int*)malloc(sizeof(int));
*p=12;
*a=*p;
}


int main()
{
int *a=NULL;
assign(a);
printf("%d",*a);
}

这样应该可以吧

不可能行。
一般做法就是
int* assign(int** pa);
懂泊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-4 00:17:33 | 显示全部楼层
昨天确实有点犯傻了,看到大家这么热情,还是得谢谢大家。
gvlr的程序是正确的,Lolita的解答也很耐心详细,ooio_karl和mech的一样,容易导致段错误。

c语言的指针里面的内容就是一个地址值而已。参数为指针时,传递的是这个地址的一个拷贝。因此,这个指针的内容(地址值)是不会变的,但是可以在子函数里改变他所指的地址的内容,相当于汇编的间接寻址;要想在子函数里改变指针,只能传递指向指针的指针。


其实,我是在一个链表程序里犯下这样的错误的:将链表的头指针传到一个子函数中去,我在子函数中改了链表的头指针,以为链表会发生变化,在主函数里发现没有任何效果,正确做法和gvlr一样,应该传递指向链表结构体的指针的指针。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表