链表的二级指针操作问题。
2个回答
展开全部
其实我想你说的应该是一个普遍的参数传递问题吧。对于一级指针和二级指针的问题。
我先说说这个参数传递的差别。你说的:
用一级指针的函数添加结点,到时候ls->next还是空指针。但是用二级指针添加结点就会是ls->next有新值?我不是很明白。而起二级指针ls貌似就么有*ls->next吧。
我举个实际例子。传入参数为S,以及指针为L1,二级指针为L2,
如果是一级指针传入:
其实是传递的是一级指针所指向的内存空间给L1
.假如说S自己的内存地址是1111,所指向的内存空间是S1111,S1111就是存放的值,L1自己的内存空间是L11111,传递后,L1指向的内存空间也是S1111,他们指向同一块内存空间。但是如果L1自己重新申请内存空间,就是说说L1指向33333,那么S指向内存空间还是S11111,L1申请空间与S没有半毛钱关系,对于新申请空间的L1操作,其实操作的内存空间是33333,S一边玩去。
如果是二级指针传入:
S自己的内存空间为1111,L2自己的内存空间为L22222,S指向的内存空间为S1111,S1111指向的内存空间为SS1111,SS1111就是存放的值了。这个时候L2222指向的内存空间也为S1111。这个时候你对*L2重新分配内存空间,就是说S1111重新指向一块内存空间33333,那么同样的对于S来说
他也是重新指向了3333这块内存。
其实是一个很简单的道理。
fun(int
*a)
{
}你如果想要在函数内部改变a指向的值使得他影响能到外面,就传递a的地址。但是如果要操作a的地址的话,就传递a的地址的地址,就是2级指针了。OK
我先说说这个参数传递的差别。你说的:
用一级指针的函数添加结点,到时候ls->next还是空指针。但是用二级指针添加结点就会是ls->next有新值?我不是很明白。而起二级指针ls貌似就么有*ls->next吧。
我举个实际例子。传入参数为S,以及指针为L1,二级指针为L2,
如果是一级指针传入:
其实是传递的是一级指针所指向的内存空间给L1
.假如说S自己的内存地址是1111,所指向的内存空间是S1111,S1111就是存放的值,L1自己的内存空间是L11111,传递后,L1指向的内存空间也是S1111,他们指向同一块内存空间。但是如果L1自己重新申请内存空间,就是说说L1指向33333,那么S指向内存空间还是S11111,L1申请空间与S没有半毛钱关系,对于新申请空间的L1操作,其实操作的内存空间是33333,S一边玩去。
如果是二级指针传入:
S自己的内存空间为1111,L2自己的内存空间为L22222,S指向的内存空间为S1111,S1111指向的内存空间为SS1111,SS1111就是存放的值了。这个时候L2222指向的内存空间也为S1111。这个时候你对*L2重新分配内存空间,就是说S1111重新指向一块内存空间33333,那么同样的对于S来说
他也是重新指向了3333这块内存。
其实是一个很简单的道理。
fun(int
*a)
{
}你如果想要在函数内部改变a指向的值使得他影响能到外面,就传递a的地址。但是如果要操作a的地址的话,就传递a的地址的地址,就是2级指针了。OK
展开全部
你好,其实这个问题我当时也迷糊了,后来想想其实也不难,呵呵,我们分析一下:
如果用c语言描述单链表如下:
typedef
struct
node{
datatype
data;//节点的数据域
struct
node
*next;//节点的指针域
}listnode;
typedef
listnode
*linklist;
listnode
*p;//p是节点
linklist
head;//head是头指针
注意最后一句:"linklist
head",这是定义了一个头结点,前面已经用typedef定义了linklist,既“typedef
listnode
*linklist;”这句,这就说明linklist
head
定义后
head实际上是一个linknode类型的指针,这是我们单单看最后两句的定义而忽略其字面意思而言的话,p和head实际上是同一种类型的变量,都是listnode类型的指针,只不过最后一句linklist类型是用typedef定义的,所以没有“*”号。
因为删除或者插入操作有时会修改实参的指针(比如头结点为空的时候插入节点,这是就修改了头结点),那么就必须将相应的形参说明为指针的指针,函数电泳时将实参指针的地址传递给相应的形参。例如:刚刚初始化的时候头结点head为空,如果这时插入节点p(由上可知p是listnode*类型的,是个指针,把它当做地址)时应该是head=p;这就改变了head的地址,所以在传参数的时候,函数的形参一般都是"insert(linklist
*head,datatype
x)",
注意:head是listnode*类型的,所以*head
是listnode**类型的,不知道我说的楼主认为可以吗?
如果用c语言描述单链表如下:
typedef
struct
node{
datatype
data;//节点的数据域
struct
node
*next;//节点的指针域
}listnode;
typedef
listnode
*linklist;
listnode
*p;//p是节点
linklist
head;//head是头指针
注意最后一句:"linklist
head",这是定义了一个头结点,前面已经用typedef定义了linklist,既“typedef
listnode
*linklist;”这句,这就说明linklist
head
定义后
head实际上是一个linknode类型的指针,这是我们单单看最后两句的定义而忽略其字面意思而言的话,p和head实际上是同一种类型的变量,都是listnode类型的指针,只不过最后一句linklist类型是用typedef定义的,所以没有“*”号。
因为删除或者插入操作有时会修改实参的指针(比如头结点为空的时候插入节点,这是就修改了头结点),那么就必须将相应的形参说明为指针的指针,函数电泳时将实参指针的地址传递给相应的形参。例如:刚刚初始化的时候头结点head为空,如果这时插入节点p(由上可知p是listnode*类型的,是个指针,把它当做地址)时应该是head=p;这就改变了head的地址,所以在传参数的时候,函数的形参一般都是"insert(linklist
*head,datatype
x)",
注意:head是listnode*类型的,所以*head
是listnode**类型的,不知道我说的楼主认为可以吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询