user-0 提问: 请教typedef Node * List在使用过程中出现的一个问题

回复:
user: user-0
content: 引用 5 楼 sholber 的回复:[quote=引用 4 楼 s3311427 的回复:] [quote=引用 3 楼 sholber 的回复:] [quote=引用 2 楼 s3311427 的回复:] [quote=引用 1 楼 sholber 的回复:] 这么半天也没有理睬篓猪，俺只好来说几句。 那么在定义函数是为什么是ListItemCount(const List *plist);而不是（ListItemCount（const List plist）？ 答：因为目的不同。plist是一个对象（即通常所谓的变量），如果它的类型是List，则它指向的对象也是实参所指向的对象，但在函数内部通过它改变不了实参本身的值。但如果它的类型是List *，则它指向实参，在函数内部可以改变实参的值，即，改变实参的指向。  如果ListItemCount(const List *plist)不就是等效于ListItemCount(const struct node * *plist);;那不就是定义了该函数接受的参数是一个指向结构体指针的指针吗？（是的。当然。）当我做List movies定义后，调用函数传递该参数时，  若是ListItemCount(const List *plist);那么在调用时不应该是ListItemCount(&moive); 若是ListItemCount(const List  plist)那么在调用时不应该是ListItemCount(movies)吗？（是的。当然。）  为什么在主函数中同时使用function（&movies）与function（movies）-----function泛指头文件中定义的函数（因为，前面说了，这两种参数形式的目的不同。）  多谢！还是有个问题，两种参数形式目的不同，那也应该是不同参数形式对应着不同的函数定义 程序中都是Initialize(const List* plist)与ListIsFull(const List * plist)这两种对应着可以改变实参指向的类型。 但是他们在传递参数是，一个使用的Initialize(&movies）一个使用ListIsFull（movies），这一点我还是没绕清楚，请指教……[/quote] 不可能混用的。如果形参是const List plist，则实参只能是movies，如果形参是const List * plist，则实参只能是&movies。因为movies是指针，则&movies是指向指针的指针嘛。[/quote] 请看图片，难道说是书本印刷错误？就是这里让我百思不得其解_(:з」∠)_[/quote]  人家用的是ListIsFull函数，不是ListIsEmpty函数。如果ListIsFull的原型是 ListIsFull (const List * plist) {/* …… */} 那就是书上错了。[/quote]   谢啦！书上除了Initialize是Initialize（&movies） 其他全是用的function（movies），而且函数原型都是function（const List * plist）

user: user-1
content: 引用 4 楼 s3311427 的回复:[quote=引用 3 楼 sholber 的回复:] [quote=引用 2 楼 s3311427 的回复:] [quote=引用 1 楼 sholber 的回复:] 这么半天也没有理睬篓猪，俺只好来说几句。 那么在定义函数是为什么是ListItemCount(const List *plist);而不是（ListItemCount（const List plist）？ 答：因为目的不同。plist是一个对象（即通常所谓的变量），如果它的类型是List，则它指向的对象也是实参所指向的对象，但在函数内部通过它改变不了实参本身的值。但如果它的类型是List *，则它指向实参，在函数内部可以改变实参的值，即，改变实参的指向。  如果ListItemCount(const List *plist)不就是等效于ListItemCount(const struct node * *plist);;那不就是定义了该函数接受的参数是一个指向结构体指针的指针吗？（是的。当然。）当我做List movies定义后，调用函数传递该参数时，  若是ListItemCount(const List *plist);那么在调用时不应该是ListItemCount(&moive); 若是ListItemCount(const List  plist)那么在调用时不应该是ListItemCount(movies)吗？（是的。当然。）  为什么在主函数中同时使用function（&movies）与function（movies）-----function泛指头文件中定义的函数（因为，前面说了，这两种参数形式的目的不同。）  多谢！还是有个问题，两种参数形式目的不同，那也应该是不同参数形式对应着不同的函数定义 程序中都是Initialize(const List* plist)与ListIsFull(const List * plist)这两种对应着可以改变实参指向的类型。 但是他们在传递参数是，一个使用的Initialize(&movies）一个使用ListIsFull（movies），这一点我还是没绕清楚，请指教……[/quote] 不可能混用的。如果形参是const List plist，则实参只能是movies，如果形参是const List * plist，则实参只能是&movies。因为movies是指针，则&movies是指向指针的指针嘛。[/quote] 请看图片，难道说是书本印刷错误？就是这里让我百思不得其解_(:з」∠)_[/quote]  人家用的是ListIsFull函数，不是ListIsEmpty函数。如果ListIsFull的原型是 ListIsFull (const List * plist) {/* …… */} 那就是书上错了。

user: user-0
content: 引用 3 楼 sholber 的回复:[quote=引用 2 楼 s3311427 的回复:] [quote=引用 1 楼 sholber 的回复:] 这么半天也没有理睬篓猪，俺只好来说几句。 那么在定义函数是为什么是ListItemCount(const List *plist);而不是（ListItemCount（const List plist）？ 答：因为目的不同。plist是一个对象（即通常所谓的变量），如果它的类型是List，则它指向的对象也是实参所指向的对象，但在函数内部通过它改变不了实参本身的值。但如果它的类型是List *，则它指向实参，在函数内部可以改变实参的值，即，改变实参的指向。  如果ListItemCount(const List *plist)不就是等效于ListItemCount(const struct node * *plist);;那不就是定义了该函数接受的参数是一个指向结构体指针的指针吗？（是的。当然。）当我做List movies定义后，调用函数传递该参数时，  若是ListItemCount(const List *plist);那么在调用时不应该是ListItemCount(&moive); 若是ListItemCount(const List  plist)那么在调用时不应该是ListItemCount(movies)吗？（是的。当然。）  为什么在主函数中同时使用function（&movies）与function（movies）-----function泛指头文件中定义的函数（因为，前面说了，这两种参数形式的目的不同。）  多谢！还是有个问题，两种参数形式目的不同，那也应该是不同参数形式对应着不同的函数定义 程序中都是Initialize(const List* plist)与ListIsFull(const List * plist)这两种对应着可以改变实参指向的类型。 但是他们在传递参数是，一个使用的Initialize(&movies）一个使用ListIsFull（movies），这一点我还是没绕清楚，请指教……[/quote] 不可能混用的。如果形参是const List plist，则实参只能是movies，如果形参是const List * plist，则实参只能是&movies。因为movies是指针，则&movies是指向指针的指针嘛。[/quote] 请看图片，难道说是书本印刷错误？就是这里让我百思不得其解_(:з」∠)_

user: user-1
content: 引用 2 楼 s3311427 的回复:[quote=引用 1 楼 sholber 的回复:] 这么半天也没有理睬篓猪，俺只好来说几句。 那么在定义函数是为什么是ListItemCount(const List *plist);而不是（ListItemCount（const List plist）？ 答：因为目的不同。plist是一个对象（即通常所谓的变量），如果它的类型是List，则它指向的对象也是实参所指向的对象，但在函数内部通过它改变不了实参本身的值。但如果它的类型是List *，则它指向实参，在函数内部可以改变实参的值，即，改变实参的指向。  如果ListItemCount(const List *plist)不就是等效于ListItemCount(const struct node * *plist);;那不就是定义了该函数接受的参数是一个指向结构体指针的指针吗？（是的。当然。）当我做List movies定义后，调用函数传递该参数时，  若是ListItemCount(const List *plist);那么在调用时不应该是ListItemCount(&moive); 若是ListItemCount(const List  plist)那么在调用时不应该是ListItemCount(movies)吗？（是的。当然。）  为什么在主函数中同时使用function（&movies）与function（movies）-----function泛指头文件中定义的函数（因为，前面说了，这两种参数形式的目的不同。）  多谢！还是有个问题，两种参数形式目的不同，那也应该是不同参数形式对应着不同的函数定义 程序中都是Initialize(const List* plist)与ListIsFull(const List * plist)这两种对应着可以改变实参指向的类型。 但是他们在传递参数是，一个使用的Initialize(&movies）一个使用ListIsFull（movies），这一点我还是没绕清楚，请指教……[/quote] 不可能混用的。如果形参是const List plist，则实参只能是movies，如果形参是const List * plist，则实参只能是&movies。因为movies是指针，则&movies是指向指针的指针嘛。

user: user-0
content: 引用 1 楼 sholber 的回复:这么半天也没有理睬篓猪，俺只好来说几句。 那么在定义函数是为什么是ListItemCount(const List *plist);而不是（ListItemCount（const List plist）？ 答：因为目的不同。plist是一个对象（即通常所谓的变量），如果它的类型是List，则它指向的对象也是实参所指向的对象，但在函数内部通过它改变不了实参本身的值。但如果它的类型是List *，则它指向实参，在函数内部可以改变实参的值，即，改变实参的指向。  如果ListItemCount(const List *plist)不就是等效于ListItemCount(const struct node * *plist);;那不就是定义了该函数接受的参数是一个指向结构体指针的指针吗？（是的。当然。）当我做List movies定义后，调用函数传递该参数时，  若是ListItemCount(const List *plist);那么在调用时不应该是ListItemCount(&moive); 若是ListItemCount(const List  plist)那么在调用时不应该是ListItemCount(movies)吗？（是的。当然。）  为什么在主函数中同时使用function（&movies）与function（movies）-----function泛指头文件中定义的函数（因为，前面说了，这两种参数形式的目的不同。）  多谢！还是有个问题，两种参数形式目的不同，那也应该是不同参数形式对应着不同的函数定义 程序中都是Initialize(const List* plist)与ListIsFull(const List * plist)这两种对应着可以改变实参指向的类型。 但是他们在传递参数是，一个使用的Initialize(&movies）一个使用ListIsFull（movies），这一点我还是没绕清楚，请指教……

user: user-1
content: 这么半天也没有理睬篓猪，俺只好来说几句。 那么在定义函数是为什么是ListItemCount(const List *plist);而不是（ListItemCount（const List plist）？ 答：因为目的不同。plist是一个对象（即通常所谓的变量），如果它的类型是List，则它指向的对象也是实参所指向的对象，但在函数内部通过它改变不了实参本身的值。但如果它的类型是List *，则它指向实参，在函数内部可以改变实参的值，即，改变实参的指向。  如果ListItemCount(const List *plist)不就是等效于ListItemCount(const struct node * *plist);;那不就是定义了该函数接受的参数是一个指向结构体指针的指针吗？（是的。当然。）当我做List movies定义后，调用函数传递该参数时，  若是ListItemCount(const List *plist);那么在调用时不应该是ListItemCount(&moive); 若是ListItemCount(const List  plist)那么在调用时不应该是ListItemCount(movies)吗？（是的。当然。）  为什么在主函数中同时使用function（&movies）与function（movies）-----function泛指头文件中定义的函数（因为，前面说了，这两种参数形式的目的不同。）