这两种两种初始化链表的方式有什么区别?我咋觉得差不多?

cart55free99 2011-03-02 11:16:10


这两种两种初始化链表的方式有什么区别?我咋觉得差不多?
createLink2 是我自己的方法

int createLink(Stu **p );
int createLink2(Stu *p );

void main(){
Stu *head;
createLink( &head );
createLink2(head);
}

int createLink(Stu **p ){
//分配内存空间的时候 最后判断的是 *p是否为空
//所以要用括号把 给*p分配地址的这一段话包起来
if ((*p=( struct Stu *) malloc(sizeof(Stu))) == NULL )
{
return false;
}else{
// 注意这里要用括号包括*p 否则*号就是对后面的表达式取地址
// 也就是对 p->next=NULL 取地址 显然会报错
(*p)->next=NULL;
return true;
}
}

int createLink2(Stu *p ){
if ((p=( struct Stu *) malloc(sizeof(Stu))) == NULL )
{
return false;
}else{
p->next=NULL;
return true;
}
}
...全文
133 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ww884203 2011-03-03
  • 打赏
  • 举报
回复
你自己的方法并没有真正影响到在main函数里面定义的指针
smwhotjay 2011-03-03
  • 打赏
  • 举报
回复
int createLink2(Stu *p ){
if ((p=( struct Stu *) malloc(sizeof(Stu))) == NULL )
{

指针p被重新设置值..指向了新内存地址..
赵4老师 2011-03-03
  • 打赏
  • 举报
回复
老生常谈:
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
AnYidan 2011-03-03
  • 打赏
  • 举报
回复
int createLink2(Stu *p )

传进了一个指针 p, 在程序的栈中,产生了一个指针 _p = p;(类似于传值,只是两个指针指向了同一个位置)
然后,你用 malloc 为 _p 分配了空间,(此时两个指针指向了不同位置),
之后,你退出了程序, _p 被抛弃, p 仍指向一个垃圾地址

楼主可以用你自己的程序验证一下
Rain208 2011-03-03
  • 打赏
  • 举报
回复
如果在函数中要修改Stu *p指针的值,就要用二级指针,传递参数&p...

up
碎碎念 2011-03-03
  • 打赏
  • 举报
回复
如果在函数中要修改Stu *p指针的值,就要用二级指针,传递参数&p....
cart55free99 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 anyidan 的回复:]

int createLink2(Stu *p )

传进了一个指针 p, 在程序的栈中,产生了一个指针 _p = p;(类似于传值,只是两个指针指向了同一个位置)
然后,你用 malloc 为 _p 分配了空间,(此时两个指针指向了不同位置),
之后,你退出了程序, _p 被抛弃, p 仍指向一个垃圾地址

楼主可以用你自己的程序验证一下
[/Quote]

你的意思是 我之间传指针到方法里面 方法中其实是产生了一个p的副本, 操作的一直是这样副本,
并不是程序外的我想要操作的p, 对否?
cart55free99 2011-03-02
  • 打赏
  • 举报
回复
弄不明白2级指针啊!
书上画的图大概是这样 head→□→■→■→■。。。。
■ 表示存贮有数据的真实节点

int createLink(Stu **p ){
if ((*p=( struct Stu *) malloc(sizeof(Stu))) == NULL )
{
经过了这么一步, 到底是分配了□ 部分, 还是第一个■?

还有一个问题 head->next 是□ 吧? head->next->next 就是第一个■?
那么 *head->next 是第一个■?
cart55free99 2011-03-02
  • 打赏
  • 举报
回复
弄不明白2级指针啊!
书上画的图大概是这样 head→□→■→■→■。。。。
■ 表示存贮有数据的真实节点

int createLink(Stu **p ){
if ((*p=( struct Stu *) malloc(sizeof(Stu))) == NULL )
{
经过了这么一步, 到底是分配了□ 部分, 还是第一个■?

还有一个问题 head->next 是□ 吧? head->next->next 就是第一个■?
那么 *head->next 是第一个■?
cart55free99 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]

这两种两种初始化链表的方式有什么区别?我咋觉得差不多?
额,你到后面发现你的第2中添加的节点根本就没通过head体现出来。你打印head所包含的地址就知道了。
[/Quote]

你的意思是书上的那种 head是指向一个空间, 但是这个空间不装任何数据,
只是在删除的时候方便些(这样就和删除其他节点一样)

该空间的下一个节点才是真正的节点 , 是这样吗?
無_1024 2011-03-02
  • 打赏
  • 举报
回复
说句老实话 你的两个方法貌似没差多少
但是没有一个是习惯的编程风格
int createLink2(Stu &p ){
按地址安徽 保存stu的修改值
pengzhixi 2011-03-02
  • 打赏
  • 举报
回复
这两种两种初始化链表的方式有什么区别?我咋觉得差不多?
额,你到后面发现你的第2中添加的节点根本就没通过head体现出来。你打印head所包含的地址就知道了。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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