C語(yǔ)言進(jìn)階:指針的進(jìn)階(3)
數(shù)組傳參和指針傳參
實(shí)踐之中不免會(huì)碰到數(shù)組和指針作函數(shù)參數(shù)而如何設(shè)計(jì)形參的問(wèn)題。
一維數(shù)組傳參
一維數(shù)組傳參,下列接收方式是否可行呢?
//1. void test(int arr[]) {} //2. void test(int arr[10]) {} //3. void test(int* arr) {} int main() { int arr[10] = { 0 }; test(arr); return 0; }
1.數(shù)組傳參數(shù)組接收,可行但其實(shí)都會(huì)降級(jí)優(yōu)化成指針,編譯器不會(huì)真正創(chuàng)建一個(gè)數(shù)組。
2.由于形參數(shù)組形同虛設(shè),所以數(shù)組大小無(wú)意義,任意大小或無(wú)。(有歧義)
3.數(shù)組傳參本質(zhì)就是首元素地址,首元素類(lèi)型為int,所以指針的類(lèi)型為int*。
所以可以看出[]和*()是等價(jià)的。我愿稱(chēng)之為*和[]的愛(ài)恨情仇?。ī\^▽?zhuān)蕞\)
//1. void test2(int* arr[2]) {} //2. void test2(int** arr) {} int main() { int* arr2[10] = { 0 }; test2(arr2); return 0; }
指針數(shù)組,每個(gè)元素類(lèi)型為int*
,故用二級(jí)指針接收數(shù)組名。
一維數(shù)組傳參,數(shù)組和指針接收。
二維數(shù)組傳參
//1. void test(int arr[3][5]) {} //2. void test(int arr[][]) {} //3. void test(int arr[][5]) {} int main() { int arr[3][5] = { 0 }; test(arr); }
- 二維數(shù)組傳參用二維數(shù)組接收,行可省略,但列不可以。
//4. void test(int* arr) {} //5. void test(int* arr[5]) {} //6. void test(int(*arr)[5]) {} //7. void test(int** arr) {} int main() { int arr[3][5] = { 0 }; test(arr); }
4.整型指針接收的應(yīng)該是整型變量的地址,而二維數(shù)組數(shù)組名為首行的數(shù)組地址。
5.指針數(shù)組和二維數(shù)組無(wú)關(guān)。
6.二維數(shù)組傳參用首行數(shù)組大小的數(shù)組指針接收。
7.二級(jí)指針和二維數(shù)組無(wú)關(guān)。
- 二維數(shù)組數(shù)組名
arr
為首行“一維數(shù)組”的地址,數(shù)組的地址用數(shù)組指針接收。
int(*)[5]
型數(shù)組指針指向元素個(gè)數(shù)為5的一維數(shù)組。指針+1訪問(wèn)到下一行,每次跳一行。再解一層引用訪問(wèn)一行里每個(gè)元素。
一級(jí)指針傳參
反向思考,若函數(shù)形參為指針,傳參時(shí)實(shí)參可以如何設(shè)計(jì)呢?
void test(int* ptr, int sz) {} void test(int arr[],int sz) {} int main() { //1. int a = 10; test(&a); //2. int arr[10] = { 0 }; test(arr); return 0; }
- 一級(jí)指針傳參,形參用指針和數(shù)組都行,但不提倡用一維數(shù)組。
- 若形參為指針,實(shí)參也可以是指針(地址),也可以是數(shù)組。
二級(jí)指針傳參
當(dāng)二級(jí)指針作參數(shù)時(shí),形參如何設(shè)計(jì)呢?
void test(int** pp) { printf("%d\n", **pp); } void test(int* arr[]) {//用法不好 printf("%d\n", *arr[0]); } int main() { int a = 10; int* p = &a; int** pp = &p; test(pp); return 0; }
- 當(dāng)二級(jí)指針作函數(shù)參數(shù)時(shí),形參可以是二級(jí)指針和指針數(shù)組。
當(dāng)形參為二級(jí)指針,實(shí)參可以傳什么呢?
void test(int** pp) { printf("%d\n", **pp); } int main() { int a = 10; int* p = &a; int** pp = &p; int* arr[10] = { &a }; //1. test(&p); //2. test(pp); //3. test(arr); return 0; }
- 當(dāng)形參為二級(jí)指針時(shí),實(shí)參可以是:二級(jí)指針(一級(jí)指針地址),指針數(shù)組首元素的地址。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)文件版通訊錄的代碼分享
這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言實(shí)現(xiàn)一個(gè)文件版通訊錄,主要運(yùn)用了結(jié)構(gòu)體,一維數(shù)組,函數(shù),分支與循環(huán)語(yǔ)句等等知識(shí),需要的可以參考一下2023-01-01C++標(biāo)準(zhǔn)模板庫(kù)vector的常用操作
今天小編就為大家分享一篇關(guān)于C++標(biāo)準(zhǔn)模板庫(kù)vector的常用操作,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12C語(yǔ)言實(shí)現(xiàn) 數(shù)據(jù)類(lèi)型占多少字節(jié)指針占多少字節(jié)
這篇文章主要介紹了 C語(yǔ)言 數(shù)據(jù)類(lèi)型占多少字節(jié)指針占多少字節(jié)的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09QT編寫(xiě)簡(jiǎn)單登錄界面的實(shí)現(xiàn)示例
登陸界面是網(wǎng)頁(yè)中常見(jiàn)的界面,本文主要介紹了QT編寫(xiě)簡(jiǎn)單登錄界面的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02用C編寫(xiě)一個(gè)送給女朋友的情人節(jié)小程序 可愛(ài)!
非??蓯?ài)的情人節(jié)小程序!文章為大家分享了用C編寫(xiě)一個(gè)送給女朋友的小程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02C語(yǔ)言實(shí)現(xiàn)財(cái)務(wù)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)財(cái)務(wù)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C語(yǔ)言課程設(shè)計(jì)之抽獎(jiǎng)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言課程設(shè)計(jì)之抽獎(jiǎng)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12淺談C++中的構(gòu)造函數(shù)分類(lèi)及調(diào)用規(guī)則
這篇文章主要介紹了C++中的構(gòu)造函數(shù)分類(lèi)及調(diào)用規(guī)則,文中根據(jù)參數(shù)寫(xiě)出了幾種不同類(lèi)型的構(gòu)造函數(shù)并解釋了如何調(diào)用,需要的朋友可以參考下2016-03-03