user-0 提问: 关于c语言函数指针的值传递问题

回复:
user: user-1
content: 已经结帖了？  如果要通过参数返回函数的值，有一句通俗的话可以记一下：  函数中要修改参数的值（对它赋值）且要返回的话，传它的指针过来！对“*变量”赋值 对指针变量也是一样：要改指针变量的值，传指针变量变量的指针过来！对“*指针变量”赋值    往深处理解 对"*形参变量“赋值即对主调函数中实参变量赋值 对"*形参指针变量“赋值即对主调函数中实参指针变量赋值

user: user-0
content: 谢谢大家了，最终我用了返回值的方法，关于指针的参数传递还是不知其所以然，我会去多看看相关代码。

user: user-2
content: 引用 7 楼 cao_julians 的回复:设计思想上建议一点， 不要这样费劲地通过参数传递实现这个功能；（如果是针对这种编程技能的特殊训练则另当别论） 改用返回值的方法更好！返回一个节点指针，成功时返回的是一个非NULL指针，失败返回的是NULL指针 同意。 除非要返回多个值的时候。

user: user-1
content: 设计思想上建议一点， 不要这样费劲地通过参数传递实现这个功能；（如果是针对这种编程技能的特殊训练则另当别论） 改用返回值的方法更好！返回一个节点指针，成功时返回的是一个非NULL指针，失败返回的是NULL指针

user: user-2
content: 引用 9 楼 cao_julians 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] [quote=引用 7 楼 cao_julians 的回复:] 设计思想上建议一点， 不要这样费劲地通过参数传递实现这个功能；（如果是针对这种编程技能的特殊训练则另当别论） 改用返回值的方法更好！返回一个节点指针，成功时返回的是一个非NULL指针，失败返回的是NULL指针 同意。 除非要返回多个值的时候。[/quote]  函数返回值的处理 １.逻辑值（int），０表示不符合要求，非０表示符合要求且其值表示事先约定的若干个项目  ２.指针值（type*)，０（ＮＵＬＬ）表示无效指针值，非０（有效指针值）表示指向结果（type)的指针 也可以理解为上面的逻辑值 。。。。 本质上的抽象方式是一样的。  当函数的返回值是一个（基本类型的或结构体类型的或指针类型）时，优先选择函数返回值方式，其次才是选用指针参数方式  让老赵提供更全面的介绍吧[/quote] 个人意见：最好的介绍就是对照windows.h里面的各函数原型在MSDN里面找对应的说明。 有时候，老师越懒，教出来的学生越勤快，水平越高。

user: user-1
content: 引用 8 楼 zhao4zhong1 的回复:[quote=引用 7 楼 cao_julians 的回复:] 设计思想上建议一点， 不要这样费劲地通过参数传递实现这个功能；（如果是针对这种编程技能的特殊训练则另当别论） 改用返回值的方法更好！返回一个节点指针，成功时返回的是一个非NULL指针，失败返回的是NULL指针 同意。 除非要返回多个值的时候。[/quote]  函数返回值的处理 １.逻辑值（int），０表示不符合要求，非０表示符合要求且其值表示事先约定的若干个项目  ２.指针值（type*)，０（ＮＵＬＬ）表示无效指针值，非０（有效指针值）表示指向结果（type)的指针 也可以理解为上面的逻辑值 。。。。 本质上的抽象方式是一样的。  当函数的返回值是一个（基本类型的或结构体类型的或指针类型）时，优先选择函数返回值方式，其次才是选用指针参数方式  让老赵提供更全面的介绍吧

user: user-3
content: #include<stdio.h>              //建议加一个#include <stdlib.h> 用于malloc函数 typedef char ElemType; typedef struct NodeType{     ElemType data;     struct NodeType *next; }NodeType,*LinkType;   int MakeNode(LinkType p, ElemType e){ //建议改成：int MakeNode(LinkType * p, ElemType e)     //这里的p只是main里的p的一个copy而已     p=(LinkType)malloc(sizeof(NodeType)); //这里的p得到另一个空间（空间b）     //建议改成：*p = (LinkType)malloc(sizeof(NodeType));     if(!p)return 0;     p->data=e;     //这里修改的是空间b里的值，空间a里的值没有因此发生改变     //建议改成 (*p)->data = e;     p->next=NULL;     //建议改成：(*p)->next = NULL     return 1; }   void main(){     NodeType p;  // 这里的p已经分配了一个结构体的内存空间（空间a）     //建议这样定义 NodeType * p;        MakeNode(&p,'m');       printf("%d",p.data);      //改成：printf("%d", p->data); }

user: user-4
content: lz应该静下心好好考虑一下传地址和传值是什么意思，应该传&p进去  函数里面分配空间的话应该*p=()malloc(sizeof()); 如果传p进去 就是传的是p的副本，副本指向的地方分配了内存空间，那么p本身呢？ 如果传&p就不一样了，&p是p这个指针变量的地址吧 如果&p的副本里面的东西的指向了一块内存空间，那么&p本身里面存储的东西也相当于指向了一块内存空间啊 函数完了&p的副本就不在了，但是&p是个地址，&p的副本的任务就是为了让这个地址里面的东西指向一块内存   &p里面存储的东西就是p哈！ 慢慢体会吧，语文学得不好

user: user-5
content: 楼主对传值与传地址分不清！

user: user-5
content: 错误原因是p是结构体变量（不是结构体指针），已经分配了存储空间，无需再分配。

user: user-6
content: p是定义了的一个变量 已经分配了地址空间，不需要再用指针去给它分配地址了 所以去掉p=(LinkType)malloc(sizeof(NodeType));即可

user: user-5
content: #include "stdafx.h" #include <stdlib.h>  typedef char ElemType;  typedef struct NodeType{     ElemType data;     struct NodeType *next; }NodeType,*LinkType;//结点类型、指针类型   int MakeNode(LinkType * p, ElemType e){     //分配由p指向的数据元素为e、后继为空的节点，并返回1，     //若分配失败，则返回0。     *p = (LinkType)malloc(sizeof(NodeType));     if(!*p)return 0;      (*p)->data=e;     (*p)->next=NULL;      return 1; }   int _tmain(int argc, _TCHAR* argv[]) {     NodeType *p = NULL;        MakeNode(&p,'m');     printf("%c",p->data);  	_gettche(); }