C語言中關(guān)于指針變量的坑
先看一個初始化帶頭結(jié)點單鏈表的例子,LNode是結(jié)點變量,LinkList是結(jié)點指針變量,等同于LNode*
typedef struct LNode{ // 定義單鏈表節(jié)點類型
int data;
struct LNode *next;
}LNode,*LinkList;
例1、錯誤的方法:初始化帶頭結(jié)點的單鏈表
void InitList(LinkList L)
{
L = (LinkList)malloc(sizeof(LNode));
L->data = 3;
L->next = NULL;
}
void Empty(LinkList L)
{
if(NULL == L)
{
printf("鏈表不存在\n");
}
else if(NULL == L->next)
{
printf("空表\n");
}
}
int main()
{
LNode p;
p.data = 2;
printf("p.data = %d\n",p.data);
LinkList L = NULL;
InitList(L);
printf("L->data = %d\n",L->data);
return 0;
}
輸出結(jié)果
p.data = 2
鏈表不存在
例2、正確的方法:初始化帶頭結(jié)點的單鏈表
void InitList(LinkList *L)
{
(*L) = (LinkList)malloc(sizeof(LNode));
(*L)->data = 3;
(*L)->next = NULL;
}
void Empty(LinkList L)
{
if(NULL == L)
{
printf("鏈表不存在\n");
}
else if(NULL == L->next)
{
printf("空表\n");
}
}
int main()
{
LNode p;
p.data = 2;
printf("p.data = %d\n",p.data);
LinkList L = NULL;
InitList(&L);
printf("L->data = %d\n",L->data);
return 0;
}
輸出結(jié)果
p.data = 2
空表
L->data = 3
為什么第一個 InitList(LinkList L)函數(shù)不能初始化單鏈表L呢?不是用的地址傳遞嗎?
答:
問題就在于L = (LinkList)malloc(sizeof(LNode));
這里的 L 是InitList函數(shù)的形參,也就是局部變量,函數(shù)運行結(jié)束后就不存在了。
而main函數(shù)中的 L 指針變量,實際上是存儲在全局變量中的,兩個L不是同一個L。
例1中,main函數(shù)中的 LinkList L 一開始是指向 NULL的

從InitList(L)執(zhí)行開始,雖然InitList函數(shù)中也是對L進行操作,但是此時的L 是InitList函數(shù)中的形參L ,之后的也都是對于形參的操作,如下圖

例1 中傳入的是LinkList 變量L,屬于一級指針,不能對實參指針變量 L本身進行操作,來修改實參 L 的值,使得L指向新分配的LNode,所以實參 L 還是指向NULL,因為輸出結(jié)果“鏈表不存在”。
例2中,傳入的是LinkList 變量的指針 &L,屬于二級指針,可以對實參指針變量 L 本身進行操作,來修改實參 L 的值,使得L指向新分配的LNode,(*L) = (LinkList)malloc(sizeof(LNode));
總結(jié)
到此這篇關(guān)于C語言中指針變量坑的文章就介紹到這了,更多相關(guān)C語言指針變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++產(chǎn)生隨機數(shù)函數(shù)簡單介紹
這篇文章主要為大家詳細介紹了C/C++產(chǎn)生隨機數(shù)函數(shù)的實現(xiàn)方法,如何使用C/C++產(chǎn)生隨機數(shù)函數(shù),感興趣的小伙伴們可以參考一下2016-04-04
C語言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實現(xiàn)方法
下面小編就為大家?guī)硪黄狢語言從txt文件中逐行讀入數(shù)據(jù)存到數(shù)組中的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12

