char *a[3]={"ert","tre","ret"};表示一個指針數(shù)組,定義的是一個數(shù)組,數(shù)組里面存的是指針,也就是:"ert","tre","ret";char **p;定義一個指向指針的指針,p=a,也就是把數(shù)組a的首元素的地址賦值給a,也就是p=("ert");那么*p="ert",**p="ert";
從策劃到設(shè)計制作,每一步都追求做到細(xì)膩,制作可持續(xù)發(fā)展的企業(yè)網(wǎng)站。為客戶提供網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁設(shè)計、域名申請、網(wǎng)頁空間、網(wǎng)絡(luò)營銷、VI設(shè)計、 網(wǎng)站改版、漏洞修補等服務(wù)。為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,以客戶的口碑塑造優(yōu)易品牌,攜手廣大客戶,共同發(fā)展進步。
cout**pendl;//輸出e,第一個元素的首字母
cout**(p+1)endl;//輸出t,第二個元素的首字母
cout*(*(p+1)+1)endl;//輸出r,第三個元素的首字母
2級指針,主要是用于傳出參數(shù),也就是用于接收返回值。
使用的時候,可以定義1級指針status,然后調(diào)用傳status。
2級指針是指向指針的指針,記住2級指針指向的還是個地址,就可以了。
而1級指針?biāo)赶虻淖兞恳c指針變量類型相符才行。
C語言傳遞參數(shù)都是傳遞"值",那么當(dāng)你想修改這個"值"的時候,就需要用到指針.
試想一下,當(dāng)你需要修改一個指針的時候,那么就需要指針的指針了
首先任何值都有地址?,一級指針的值雖然是地址,但這個地址做為一個值亦需要空間來存放,是空間就具有地址?,這就是存放地址這一值的空間所具有的地址,二級指針就是為了獲取這個地址,
一級指針?biāo)P(guān)聯(lián)的是其值(一個地址)名下空間里的數(shù)據(jù),這個數(shù)據(jù)可以是任意類型并做任意用途,但二級指針?biāo)P(guān)聯(lián)的數(shù)據(jù)只有一個類型一個用途,就是地址,指針就是兩個用途提供目標(biāo)的讀取或改寫,?那么二級指針就是為了提供對于內(nèi)存地址的讀取或改寫
指針的表現(xiàn)形式是地址,核心是指向關(guān)系指針運算符“*”的作用是按照指向關(guān)系訪問所指向的對象.如果存在A指向B的指向關(guān)系,則A是B的地址,“*A”表示通過這個指向關(guān)系間接訪問B.如果B的值也是一個指針,它指向C,則B是C的地址,“*B”表示間接訪問C如果C是整型、實型或者結(jié)構(gòu)體等類型的變量或者是存放這些類型的數(shù)據(jù)的數(shù)組元素,則B(即C的地址)是普通的指針,稱為一級指針,用于存放一級指針的變量稱為一級指針變量。
A(即B的地址)是指向指針的指針,稱為二級指針,用于存放二級指針的變量稱為二級指針變量.根據(jù)B的不同情況,二級指針又分為指向指針變量的指針和指向數(shù)組的指針.
你可以將二維數(shù)組名理解成一個二級指針……
可以看看這個:
#include?stdio.h??
#include?stdlib.h??
#include?string.h??
void?memorylocate(char?**ptr)??
{??
*ptr=(char?*)malloc(10*sizeof(char));??
}??
int?main()??
{??
char?*buffer;??
memorylocate(buffer);??
strcpy(buffer,"12345");??
printf("buffer?%s\n",buffer);??
return?0;??
}
你分析下這個函數(shù)想要干什么就會明白了
HL不是頭結(jié)點指針,是指針的指針!
參考:
你有一個任意指針P,你想要它等于NULL,有兩種方法:通過P、或者P的指針
如果它是全局的,你可以在任何地方直接用P=NULL,包括函數(shù)里,都可以讓原始P變成NULL,
如果不是全局,而且你想在函數(shù)里通過參數(shù)傳遞修改它,就要先取得函數(shù)外的P操作權(quán),只能通過P的指針,你直接傳P進去,得到的只是P副本,所以必須通過P的指針P,然后在函數(shù)里用*(P)得到函數(shù)外面的P,才能修改到P!這些正逆運算就是你要使用函數(shù)所付出的代價,不過得到了其它的好處!
首先說下這函數(shù),你是覺得這樣定義也可以?
void InitList(struct sNode* HL)
{
HL=NULL;
}
然后:
InitList(p);
這樣是不行的,它改變的不是你的p,而是P的一個副本,可以假想為P1,剛傳進去時,這P1跟P一樣指向同一個東西,當(dāng)函數(shù)執(zhí)行完,P1就變空了,而P還是原來的P!這個函數(shù)就跟外界沒有任何聯(lián)系。如果用*HL,得到一個struct sNode,能修改但并不是這函數(shù)要的效果!
一級指針的例子:
int a=0;
//想讓a變成2,你如果這樣聲明函數(shù):
/*void Init(int HL)
{
HL=2;
}
*/
Init(a);//不行
/*只能這樣:
void Init(int* HL)
{
*HL=2;
}
*/
//:然后
Init(a);