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進(jìn)行操作,但是此時的L 是InitList函數(shù)中的形參L ,之后的也都是對于形參的操作,如下圖

例1 中傳入的是LinkList 變量L,屬于一級指針,不能對實參指針變量 L本身進(jìn)行操作,來修改實參 L 的值,使得L指向新分配的LNode,所以實參 L 還是指向NULL,因為輸出結(jié)果“鏈表不存在”。
例2中,傳入的是LinkList 變量的指針 &L,屬于二級指針,可以對實參指針變量 L 本身進(jìn)行操作,來修改實參 L 的值,使得L指向新分配的LNode,(*L) = (LinkList)malloc(sizeof(LNode));
總結(jié)
到此這篇關(guān)于C語言中指針變量坑的文章就介紹到這了,更多相關(guān)C語言指針變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-12-12
Matlab實現(xiàn)統(tǒng)計集合中各元素出現(xiàn)次數(shù)的示例代碼
統(tǒng)計數(shù)組中各個元素數(shù)量是一個很常用的功能,本文主要為大家介紹了如何利用Matlab優(yōu)雅的統(tǒng)計集合中各元素出現(xiàn)的次數(shù),感興趣的可以了解一下2022-05-05
C++ std::initializer_list 實現(xiàn)原理解析及遇到問題
這篇文章主要介紹了C++ std::initializer_list 實現(xiàn)原理勘誤,本文通過源碼解析給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
Visual?Studio?2022?配置?PCL?1.12.1?的問題小結(jié)
這篇文章主要介紹了Visual?Studio?2022?配置?PCL?1.12.1?的經(jīng)驗總結(jié)分享,本文通過圖文實例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
使用ShellClass獲取文件屬性詳細(xì)信息的實現(xiàn)方法
本篇文章是對ShellClass獲取文件屬性詳細(xì)信息的實現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
ubuntu系統(tǒng)vscodeC++編譯環(huán)境配置與使用方式
這篇文章主要介紹了ubuntu系統(tǒng)vscodeC++編譯環(huán)境配置與使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12

