C 语言指针问题求解

2014-11-26 01:31:49 +08:00
 Plumes
代码如下,使用 gcc 4.9.1 编译:

https://gist.github.com/hzpbox/c1a5a63e4b78c8a0df45

这是一个简单的顺序线性表实现,主要有两个个疑问

1. 为什么创建的线性表 L 在主函数里的地址与传给函数后的地址不同?如图所示


2. 此代码的 ListInsert 函数并不能够实现插入功能,虽然能够将数据项都插入到 L.data 中,但是无法改写 L.length 的值,例如在此代码中的 main 函数中分别执行了三条插入语句,但是打印的时候 L.length 为 0。 而如果在打印函数 PrintList 中将 L.length 值改为 3,则可将插入的数据正常打印出来。
2166 次点击
所在节点    问与答
4 条回复
canautumn
2014-11-26 01:47:37 +08:00
ListInsert后边是传值传递,不是引用传递。L被复制了一份传进函数了。所以地址不同,而且不会修改主函数里的L。
canautumn
2014-11-26 01:53:40 +08:00
又看了一眼。L复制了一份,所以L本身的地址变了,但是data和length的指针位置直接被复制,是不变的,所以data的值改了。但是L.length++是指针自增1,不是值自增1。应该是*(L.length)++,不过建议一个int不要用指针了。
bbvps
2014-11-26 04:25:41 +08:00
int ListInsert (SeqList L, int i, int e)--> int ListInsert (SeqList *L, int i, int e) 并修改这个函数的内部,则能够达到你想要的结果。
pljhonglu
2014-11-26 08:54:07 +08:00
ListInsert应该传引用值,要搞清楚值传递与引用传递的区别。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/149301

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX