有一段時(shí)間沒(méi)有總結(jié)了缀匕,一是最近比較忙(借口纳决,時(shí)間就像海綿,擠擠還是會(huì)冒水的)乡小,而來(lái)確實(shí)還沒(méi)有進(jìn)入真正的簡(jiǎn)書(shū)習(xí)慣阔加。不廢話了,進(jìn)入正題满钟,總結(jié)下指針的學(xué)習(xí)胜榔,本科就接觸過(guò)這東西,可惜那時(shí)根本沒(méi)有認(rèn)真湃番,其實(shí)那時(shí)學(xué)校就是個(gè)一般二本夭织,以為讀了也是白讀,其實(shí)不是的吠撮,其實(shí)在任何學(xué)校尊惰,只要你愿意,你可以學(xué)到基本的很多一些東西,現(xiàn)在來(lái)說(shuō)弄屡,以前一知半解的東西可以好好學(xué)學(xué)了题禀。
說(shuō)到指針,其實(shí)很多人會(huì)想到指南針琢岩,那么指南針其實(shí)是用來(lái)指明方向的投剥,當(dāng)然指針也是用來(lái)指明方向和地址的,說(shuō)白了担孔,一個(gè)指針也就是內(nèi)存里的地址江锨,用來(lái)存儲(chǔ)數(shù)據(jù)的,我們可以利用指針?biāo)竷?nèi)存空間去隨意調(diào)用數(shù)據(jù)糕篇,非常方便啄育。
1>一維數(shù)組的定義
*:作為指針的標(biāo)志,以前第一次學(xué)的時(shí)候基本是走過(guò)場(chǎng)拌消,這次學(xué)習(xí)之前很多學(xué)生一直糾結(jié)指針不好理解挑豌,對(duì)此可能因人而異吧。首先如何去定義一個(gè)指針墩崩,對(duì)于定義一個(gè)指針氓英,主要包括類(lèi)型說(shuō)明符+"*"+變量名。
例如:定義一個(gè)整型的指針變量如下:
int *p=&a;
p=&a或者p=&a[0];
在這里是把一個(gè)數(shù)a的地址給了p鹦筹,這樣就可以通過(guò)地址p來(lái)調(diào)用a這個(gè)元素铝阐。
又如定義了一個(gè)一維數(shù)組arr,則p=&arr[0],數(shù)組首個(gè)元素的地址就是該數(shù)組的地址铐拐。
int arr[]={1,2,3,4,5,6};
for(i=0;i<6;i++)
{
printf("arr[%d]=%d\n",i,*(arr+i));
printf("arr[%d]的地址=%p\n",i,arr+i);
}
當(dāng)然獲得數(shù)組的每個(gè)元素還可以通過(guò)指針變量p來(lái)尋址徘键,如
printf("arr[%d]的地址=%p\n",i,p++);
這樣就可以輸出所有元素在內(nèi)存的地址。
2>二維數(shù)組的定義:數(shù)據(jù)類(lèi)型(int float char double)遍蟋,數(shù)組名[行的大小][列的大小]
當(dāng)然對(duì)于二維數(shù)組的定義吹害,我們可以看作是多個(gè)一維數(shù)組構(gòu)成二維數(shù)組的定義方式有以下幾種:
1>二維數(shù)組的初始化
int arr1[2][3]={{1,2,3},{4,5,6}};
2>如果沒(méi)有完全數(shù)組元素,用0補(bǔ)全
int arr2[2][3]={{1,2},{4,5}};
3>int arr3[2][3]={1,2,3,4,5,6};
4>int arr4[2]['a']={1,2,3};
5>根據(jù)后面的列數(shù)推算行數(shù)大小
int arr5[][3]={1,2,3,4,5};
基于第五種方式虚青,以下寫(xiě)法是錯(cuò)誤的
int arr6[2][]={1,2,3,4};
6>int arr6[2][3]={{[1]=2},{[1]=5}};
2.1>二維數(shù)組定義時(shí)需要注意的點(diǎn)位:
1>行號(hào)和列號(hào)不能以變量存在它呀,必須要以常量存在;
2>行號(hào)可以省挟憔,列號(hào)不能省;
3>二維數(shù)組的訪問(wèn)
數(shù)組元素的訪問(wèn):數(shù)組名[行下標(biāo)][列下標(biāo)]钟些,這可能是最常見(jiàn)的訪問(wèn)方式,并且0<=行下標(biāo)<行的大小绊谭,0<=列下標(biāo)<列的大小政恍,如對(duì)arr1進(jìn)行訪問(wèn),訪問(wèn)arr1任何一個(gè)元素达传,則只需要在主函數(shù)里輸入以下代碼:
for(i=0;i<2,i++)
{
for(j=0;j<3,j++)
{
printf("arr1[%d][%d]=%d\t",i,j,arr1[i][j]);
}
printf("\n");
}
其實(shí)二維數(shù)組在內(nèi)存中是連續(xù)存儲(chǔ)的篙耗,可以用以下代碼證明:在上述代碼中加這句
printf("arr1[%d][%d]=%p\t",i,j,&arr1[i][j]);
除了以上尋址方式迫筑,二維數(shù)組還有多種方式,對(duì)于訪問(wèn)第i行第j列的地址宗弯,
&arr1[i][j]=arr1[i]+j=*(arr1+i)+j
而對(duì)應(yīng)的第i行第j列的值是arr1[i][j]=*(arr1[i]+j)=*(*(arr1+i)+j)
二維數(shù)組名保存的是第0行第0列的元素的地址
第i行第0列元素的地址:&arr1[i][0]脯燃,arr1+i,arr1[i]蒙保,*(arr1+i)
4>指向多維數(shù)組的指針變量
可定義為:int (*p)[4]
先計(jì)算()辕棚,表明它是一個(gè)指針變量,再算[]邓厕,代表這個(gè)指針將來(lái)指向一個(gè)大小為4的一維數(shù)組逝嚎。
int *p[4]
先算[],表明它是一個(gè)數(shù)組详恼,再算*补君,表明將來(lái)這個(gè)數(shù)組里面存的是指針變量
int a[2][3]={1,2,3,4,5,6,7,8,9};
int *pa[3]={a[0],a[1],a[2]};
int *p=a[0]
這樣pa是一個(gè)指針數(shù)組,a[0],a[1],a[2]均為指針變量昧互。