C一级指针和二级指针问题
本帖最后由 shiwobuhaoma 于 2021-3-20 09:40 编辑#include<stdio.h>
#include<stdlib.h>
struct Book{
char title;
char author;
struct Book *next;
};
void initBook(struct Book *book){
...
}
//头插法,所以函数参数是一个指向一级指针地址的二级指针
void addBookToLibrary(struct Book **library){
struct Book *book,*temp;
book = (struct Book *)malloc(sizeof(struct Book));
if(book == NULL){
printf("内存不足");
exit(1);
}
initBook(book);
//我的疑问出现在这里的*library上!!
//这里的*是取指针指向的变量中存储的值,又因为library是一个二级指针,所以*library就代表是取二级指针指向的变量中保存的值?不知道可不可以这么理解?这么理解对吗?
//如果不对,错在了哪里?
if(*library != NULL){//这里的判断是链表的头结点是否不为空
temp = *library;
*library = book;
book->next = temp;
}else{
*library = book;
book->next = NULL;
}
}
int main(void){
struct Book *library = NULL;
//这里是传的一级指针的地址
initLibrary(&library);
}
楼主,你这是付费浏览,不奉上银子还不让看? jackz007 发表于 2021-3-19 12:09
楼主,你这是付费浏览,不奉上银子还不让看?
我笑了,我本来是要发悬赏的… jackz007 发表于 2021-3-19 12:09
楼主,你这是付费浏览,不奉上银子还不让看?
我已经调整好了,麻烦老师帮忙看一下,谢谢! 本帖最后由 jackz007 于 2021-3-20 11:35 编辑
首先,看看这个例子:
#include <stdio.h>
void foo(int ** p)
{
* p += 5 ;
}
main(void)
{
int a[] = {1 , 10 , 100 , 1000 , 10000 , 100000} , * p ;
p = & a ; // p 指向 a
printf("p = %p , * p = %d\n" , p , * p) ; // 打印 p 及 a 的数值
foo(& p) ; // 调用过后,p 指向 a
printf("p = %p , * p = %d\n" , p , * p) ; // 打印 p 及 a 的数值
}
编译、运行实况
D:\00.Excise\C>g++ -o x x.c
D:\00.Excise\C>x
p = 0022FEA8 , * p = 1
p = 0022FEBC , * p = 100000
D:\00.Excise\C>
通过这个例子我们看到,调用过 foo(& p) 之后,一级指针 p 的数值被改变,是的,这就是本例也是楼主问题的核心要义!
看懂了上面的例子,我想,楼主的问题也就不再需要多做解释了
int main(void){
struct Book * lib = NULL;
. . . . . .
addBookToLibrary(& lib) ; // lib 是一级指针,& lib 成为二级指针,这样调用函数的目的,通常是为了在函数中修改调用参数 lib 的数值
}
. . . . . .
void addBookToLibrary(struct Book ** library)// 传递二级指针的目的,是为了修改一级指针 (* library) 的数值
{
if(* library != NULL){ // 函数中需要使用一级指针,那么,* library 就是一级指针
temp = * library;
* library = book; // 一级指针被赋值,意味着调用参数被修改,修改 * library 就是修改 main() 中的调用参数 lib 的值
book->next = temp ;
}else{
*library = book ; // 一级指针被赋值,意味着调用参数被修改,修改 * library 就是修改 main() 中的调用参数 lib 的值
book->next = NULL ;
}
} jackz007 发表于 2021-3-20 11:12
首先,看看这个例子:
编译、运行实况
谢谢老师!真想加您个微信啊!
页:
[1]