一直不是很明白链表为何要这样构造[解决办法]typedef struct clist{int aclist *next}ClistClist * ini
一直不是很明白链表为何要这样构造
[解决办法]
typedef struct clist
{
int a;
clist *next;
}Clist;
Clist * initiate()
{
Clist *list;
if((list=(Clist *)malloc(sizeof(Clist)))==NULL)
exit(1);
list->next=NULL;
return list;
}
list = initiate();
也可以这样
[解决办法]如果你要从参数中返回新分配的地址,必须这样写啊。
你要改变实参的值,必须指针传递
你这边要修改的是CList*的值, 因此,必须传递CList**
[解决办法]也可以不这么做,用单指针也可以,但是这时候我们需要return 这个指针了。用双指针的好处是我们可以在初始化的时候把我们这个时候初始化的那个指针写到list里面去,并且我们外面可以直接用的,但是用单指针不行的。
[解决办法]每种调用方法都有它的用途,根据实际情况。
[解决办法]看看林锐的 《高质量 c/c++编程》
[解决办法]存在即合理,另外从来不自己写链表,直接调用list.h里的通用量表实现方法……
[解决办法]习惯了就好了
[解决办法]不知道,会用就好
[解决办法]这样才能保证传回来的是地址啊。否则传送的是指针的值,那就没意义了。
你还要搞懂传值和传址的区别。
比如如果你调用一个子函数,如果要穿一个&a,那么子函数就会用int *a,来接受。如果是字符串,你要么用char **str。要么就要用return一个指针,因为你需要那个地址。其实你用引用也可以啊。
[解决办法]习惯用引用
[解决办法]学习了
[解决办法]VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
提醒:
“学习用汇编语言写程序”
和
“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
[解决办法]不习惯的话就return一个指针回去吧
因为c没有引用传值,都是值传值
如果参数只是一级指针的话,起不到改变数据的目的
[解决办法]你的代码里面那个j去哪里了?而且你测试你的成功插入是不是只测了p指向的结点??
Clist *p当然没有分配内存,只是分配了一个指针而已
[解决办法]定义的Clist *p系统默认分配的地址是0xcccccccc,是不能使用的。
[解决办法]C语言是值传递,懂?
[解决办法]条条大路通罗马,程序是死的,人是活的
[解决办法]没建空间。插入的数据放那里??
[解决办法]没有开空间,满了怎么办,最晚有时候能运行,但早晚要出错的
[解决办法]合理就好了,写法很随意啦