C語(yǔ)言學(xué)習(xí)之七——指針_2_數(shù)組

!9鼙小腿椎!注意:因?yàn)楹?jiǎn)書(shū)的顯示格式緣故,所以“ * ”顯示會(huì)出現(xiàn)問(wèn)題夭咬,可能有些星號(hào)由于疏忽未改動(dòng)格式啃炸,造成沒(méi)有顯示,請(qǐng)多多包含卓舵,如有錯(cuò)誤南用,請(qǐng)留言或聯(lián)系本人更正,謝謝!

  1. 指針和數(shù)組
    1.1通過(guò)指針得到整個(gè)數(shù)組:由于數(shù)組是由各個(gè)具有相同性質(zhì)的數(shù)組元素按照一定順序排布的集合训枢,而每個(gè)數(shù)組元素都占一定的內(nèi)存空間托修,且由數(shù)據(jù)結(jié)構(gòu)知識(shí)可知,數(shù)組元素在內(nèi)存中的排布是連續(xù)的恒界。因此睦刃,只要知道數(shù)組的首地址,那么整個(gè)數(shù)組就可以被知曉十酣。由此可知涩拙,只需要將指針指向數(shù)組首地址,就可以按照地址順序知道整個(gè)數(shù)組耸采。

    1.2數(shù)組元素的指針:即為指向數(shù)組元素的指針(換句話說(shuō)兴泥,就是數(shù)組元素的地址)。見(jiàn)例1

//例1虾宇,定義一個(gè)指向數(shù)組元素的指針變量
int a[5] = {1,2,3,4,5}; //定義數(shù)組a
int *p; //定義指針變量p
p = &a[2]; //將數(shù)組a的第三個(gè)元素的地址賦給p(即p中存儲(chǔ)數(shù)組a的第三個(gè)元素的地址)

引用數(shù)組元素的方法:1)下標(biāo)法,如a[i]; 2)指針?lè)?如(a+i)或(p+ i)搓彻。(注:i為第i+1個(gè)元素)

//例2
/#include<stdio.h>
void main()
{
int a[5] = {1,2,3,4,5};
int *p, i;
p = a; //這里a是數(shù)組名,p是指向數(shù)組元素的指針變量,注意:數(shù)組名即“翻譯成數(shù)組的第一個(gè)元素的地址嘱朽!因此將數(shù)組的第一個(gè)元素的地址賦給p旭贬,后面的數(shù)組元素就可以通過(guò)地址+1得到。
//p = &a[0]; //這也是同樣道理搪泳,因?yàn)閍[0]的地址即為數(shù)組的首地址稀轨。
for(i = 0; i < 5; i++)printf("%d ", *(p + i));
printf("\n");
}

例題:假設(shè)有一個(gè)a數(shù)組,整型,有10個(gè)元素岸军。要輸出各元素的值有三種方法奋刽,見(jiàn)例3.
(1) 下標(biāo)法
(2) 通過(guò)數(shù)組名計(jì)算數(shù)組元素地址,找出元素的
值。
(3) 用指針變量指向數(shù)組元素艰赞。

//例3
/#include<stdio.h>
void main()
{
int a[5] = {1,2,3,4,5};
int *p, i;
for(i = 0; i < 5; i++)printf("第一種方法:%d ", a[i]);
printf("\n");
for(i = 0; i < 5; i++)printf("第二種方法:%d ", *(a + i));
printf("\n");
p = a; //p = &a[0]也是等價(jià)的
for(i = 0; i < 5; i++)printf("第三種方法:%d ", *(p + i));
printf("\n");
}
//輸出:第一種方法:1 第一種方法:2 第一種方法:3 第一種方法:4 第一種方法:5
第二種方法:1 第二種方法:2 第二種方法:3 第二種方法:4 第二種方法:5
第三種方法:1 第三種方法:2 第三種方法:3 第三種方法:4 第三種方法:5

  1. 用數(shù)組名作函數(shù)參數(shù)
    2.1 f(int arr[], int n) 與 f(int *arr, int n)佣谐,這兩個(gè)是等價(jià)的,因?yàn)樵诰幾g時(shí)編譯器將arr按照指針變量處理(因?yàn)椴粒琣rr中存儲(chǔ)的是數(shù)組的首地址台谍,在調(diào)用函數(shù)f的時(shí)候,取的是數(shù)組arr 的首地址然后進(jìn)行下面一系列運(yùn)算)(注:C語(yǔ)言調(diào)用函數(shù)時(shí)虛實(shí)結(jié)合的方法都是采用“值傳遞”方式,當(dāng)用變量名作為函數(shù)參數(shù)時(shí)傳遞的是變量的值,當(dāng)用數(shù)組名作為函數(shù)參數(shù)時(shí),由于數(shù)組名代表的是數(shù)組首元素地址,因此傳遞的值是地址,所以要求形參為指針變量吁断。)
    見(jiàn)例4趁蕊,例5

//例4
/#include<stdio.h>
void main()
{
int a[5] = {1, 2, 3, 4, 5};
int *p, f(int arr[], int n);
f(a, 5);
printf("http:///////////////////////////////////////////////////\n");
p = a;
f(p, 5);
}

int f(int arr[], int n)
{
int i;
for (i= 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
//輸出:
1 2 3 4 5
///////////////////////////////////////////////////
1 2 3 4 5

//例5
/#include<stdio.h>
void main()
{
int a[5] = {1, 2, 3, 4, 5};
int *p, f(int *arr, int n);
f(a, 5);
printf("http:///////////////////////////////////////////////////\n");
p = a;
f(p, 5);
}

int f(int *arr, int n)
{
int i;
for (i= 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
//輸出:
1 2 3 4 5
///////////////////////////////////////////////////
1 2 3 4 5

例題:將數(shù)組a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}中10個(gè)整數(shù)按相反順序存放
方法一,用將數(shù)組a的數(shù)組反向插入到另一個(gè)空數(shù)組中:

/#include<stdio.h>
void main()
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, b[10];
int reverse(int a[], int b[]);
int i;
reverse(a, b);
for (i = 0; i <= 9; i++)
{
printf("%d ", b[i]);
}
printf("\n");
}

int reverse(int a[], int b[])
{
int i, j;
for (i = 0, j = 9; i <= 9 && j >= 0; i++, j-- )
{
b[j] = a[i];
}
return b[0];
}
//輸出:10 9 8 7 6 5 4 3 2 1

方法二仔役,將數(shù)組的末元素地址賦給一個(gè)數(shù)組變量掷伙,然后依照地址數(shù)-1的順序得到反向的數(shù)組元素,并依次存入另一個(gè)空數(shù)組中又兵。

/#include<stdio.h>
void main()
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, b[10];
int *p, i;
void reverse(int *p1, int b[]);
p = &a[9];
reverse(p, b);
for (i = 0; i <= 9; i++)
{
printf("%d ", b[i]);
}
printf("\n");
}

void reverse(int *p1, int b[])
{
int i;
for (i = 0; i <= 9; i++)
{
b[i] = *(p1 - i);
}
}
//輸出:10 9 8 7 6 5 4 3 2 1

2.2歸納:如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中調(diào)用這個(gè)實(shí)參數(shù)組,實(shí)參與形參的對(duì)應(yīng)關(guān)系有以下4種情況:
1)形參和實(shí)參都用數(shù)組名,如:

void main()
{
int a[10];
void f(int x[],int n) //函數(shù)聲明
f(a,10); //函數(shù)調(diào)用任柜,這里傳入的參數(shù)都是實(shí)參
}

void f(int x[],int n) //函數(shù)定義卒废,這里定義的參數(shù)都是實(shí)參
{
……
}

2)實(shí)參用數(shù)組名,形參用指針變量。如:

void main()
{
int a[10];
void f (int *a, int n)宙地;
f (a, 10);
}

void f (int *a, int n)
{
…...
}

3)實(shí)參形參都用指針變量摔认。例如:

void main()
{
int a[10], *p;
p = a;
void f (int *x, int n);
f (p , 10);
}

void f (int *x, int n)
{
......
}

4)實(shí)參為指針變量,形參為數(shù)組名。如:

void main()
{
int a[10], *p;
p = a;
f(p,10);
}

f (int x[], int n)
{
............
}

例題:對(duì)數(shù)組中10個(gè)整數(shù)按由大到小順序排序
/#include<stdio.h>
void main()
{
int a[10] = {99, 88, 11, 77, 56, 35, 110, 201, 5, 33};
int sort(int a[], int n);
int i;
sort(a, 10);
for(i = 0; i < 10; i++)printf("%d ", a[i]);
printf("\n");
}

int sort(int a[], int n)
{
int i, j, temp;
for(i = 0; i < (n - 1); i++)
for(j = i; j < n; j++)
{
if (a[i] < a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
//輸出:201 110 99 88 77 56 35 33 11 5

  1. 多維數(shù)組與指針
    3.1設(shè)有一個(gè)二位數(shù)組a[3][4]={{1,3,5,7},{9,11,13,15},{17,19,21,23}}宅粥,且其首地址為2000参袱,則其內(nèi)存中的存儲(chǔ)方式為:


    二維數(shù)組在內(nèi)存中的存儲(chǔ)方式

    指針及下標(biāo)表示數(shù)組的方式

    3.2指向?qū)S數(shù)組元素的指針變量:
    把二維數(shù)組a分解為一維數(shù)組a[0],a[1],a[2]之后,設(shè)p為指向二維數(shù)組的指針變量』嗝罚可定義為:int ( * p)[4] (它表示p是一個(gè)指針變量,它指向包含4個(gè)元素的一維數(shù)組抹蚀。若指向第一個(gè)一維數(shù)組a[0],其值等于a,a[0],或&a[0][0]等。而p+i則指向一維數(shù)組a[i]企垦。)
    由此我們可以得出 * (p+i)+j是二維數(shù)組i行j 列的元素的地址,而 * (*(p+i)+j)則是i行j列元素的值环壤。

    二維數(shù)組指針變量的一般定義形式:類型說(shuō)明符(指針變量名)[長(zhǎng)度] (“類型說(shuō)明符”為所指數(shù)組的數(shù)據(jù)類型〕睿“”表示其后的變量是指針類型郑现。“長(zhǎng)度”表示二維數(shù)組分解為多個(gè)一維數(shù)組時(shí),一維數(shù)組的長(zhǎng)度,也就是二維數(shù)組的列數(shù)荧降。)見(jiàn)例6

//例6
/#include <stdio.h>
void main()
{
int a[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
int (* p)[4];
int i, j;
p = a;
for( i=0; i < 3; i++)
{
for( j=0; j < 4; j++)
{
printf("%2d ", * ( * (p+i)+j)); /這里的i就表示 行懂酱,j表示列,+i的時(shí)候即根據(jù) ( * p)[4] 中4列的原則誊抛,從數(shù)組的首地址跳過(guò)4 * i個(gè)數(shù)組元素存儲(chǔ)空間,到i行;+j的時(shí)候即從i行的起始位置算起跳過(guò)j個(gè)數(shù)組元素存儲(chǔ)空間到j(luò)列整陌,到此即為要找的數(shù)組元素/

}
printf("\n");
}
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拗窃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子泌辫,更是在濱河造成了極大的恐慌随夸,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件震放,死亡現(xiàn)場(chǎng)離奇詭異宾毒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)殿遂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén)诈铛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人墨礁,你說(shuō)我怎么就攤上這事幢竹。” “怎么了恩静?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵焕毫,是天一觀的道長(zhǎng)蹲坷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)邑飒,這世上最難降的妖魔是什么循签? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮疙咸,結(jié)果婚禮上县匠,老公的妹妹穿的比我還像新娘。我一直安慰自己罕扎,他們只是感情好聚唐,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著腔召,像睡著了一般杆查。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上臀蛛,一...
    開(kāi)封第一講書(shū)人閱讀 52,874評(píng)論 1 314
  • 那天亲桦,我揣著相機(jī)與錄音,去河邊找鬼浊仆。 笑死客峭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抡柿。 我是一名探鬼主播舔琅,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洲劣!你這毒婦竟也來(lái)了备蚓?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤囱稽,失蹤者是張志新(化名)和其女友劉穎郊尝,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體战惊,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡流昏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吞获。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片况凉。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖各拷,靈堂內(nèi)的尸體忽然破棺而出茎刚,到底是詐尸還是另有隱情,我是刑警寧澤撤逢,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布膛锭,位于F島的核電站粮坞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏初狰。R本人自食惡果不足惜莫杈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奢入。 院中可真熱鬧筝闹,春花似錦大刊、人聲如沸眷蜓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至胆剧,卻和暖如春骇塘,著一層夾襖步出監(jiān)牢的瞬間汛闸,已是汗流浹背捉片。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工平痰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伍纫。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓宗雇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親莹规。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赔蒲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容