廣州市網(wǎng)站建設(shè) 駿域動(dòng)力北京已感染上千萬人
目錄
- 數(shù)組傳參
- 一維數(shù)組傳參
- 二維數(shù)組傳參
- 指針傳參
- 一級(jí)指針傳參
- 二級(jí)指針傳參
我們?cè)趯懘a的時(shí)候難免要把數(shù)組
或者指針
傳給函數(shù),那函數(shù)的參數(shù)該如何設(shè)計(jì)呢?
數(shù)組傳參
一維數(shù)組傳參
我們首先來看下面代碼的幾個(gè)例子:
#include <stdio.h>
void test(int arr[])//ok?--Yes
{}
void test(int arr[10])//ok?--Yes
{}
void test(int* arr)//ok?--Yes
{}
void test2(int* arr[20])//ok?--Yes
{}
void test2(int** arr)//ok?--Yes
{}
int main()
{int arr[10] = {0};int* arr2[20] = {0};test(arr);test2(arr2);
🚩首先來看test(arr);
看看它的函數(shù)參數(shù)可以怎么寫?
因?yàn)?code>test(arr);傳過去的是數(shù)組,所以上面的void test( ){}
也可以用數(shù)組接收,
即寫成void test(int arr[]){}
當(dāng)然[]
里可以寫數(shù)組大小,也可以不寫,里面的數(shù)字對(duì)語法沒任何影響,所以我們還可以寫做void test(int arr[10]){}
或void test(int arr[30]){}
(當(dāng)然這樣寫30,雖然語法正確,但沒任何意義)
上面的寫法即是數(shù)組傳參,形參寫成數(shù)組的形式。
我們知道,數(shù)組傳參本質(zhì)上傳過去的是數(shù)組首元素的地址,所以參數(shù)部分我們就可以寫成指針了
我們來分析一下
test(arr);
數(shù)組名arr是首元素的地址, int arr[10] = {0};
可以看出每個(gè)元素的類型是int類型。
test(arr);
傳過去的是首元素的地址,首元素的地址是一個(gè)int類型的元素的地址,int類型元素的地址如果要用指針來接收,那就該用int類型指針來接收,所以可以寫成void test(int* arr){}
🚩接下來我們來看 test2(arr2);
數(shù)組傳過來,用數(shù)組接收,寫做void test2(int* arr[20]){}
以及void test2(int* arr[]){}
,原理同上面的test(arr);
那數(shù)組傳參寫成指針又怎么寫呢?
數(shù)組傳參本質(zhì)上傳過去的是數(shù)組首元素的地址, int* arr2[20] = {0};
可以看出,首元素類型為int*,即每個(gè)元素都是個(gè)整型指針,所以int*類型元素的地址如果要用指針來接收,那就該用int*類型指針來接收,即一級(jí)指針地址傳過去,就需要用二級(jí)指針來接收,所以可以寫成void test(int** arr){}
二維數(shù)組傳參
同樣,我們首先來看下面代碼的幾個(gè)例子:
void test(int arr[3][5])//ok?--Yes
{}
void test(int arr[][])//ok?--No
{}
void test(int arr[][5])//ok?--Yes
{}
//總結(jié):二維數(shù)組傳參,函數(shù)形參的設(shè)計(jì)只能省略第一個(gè)[]的數(shù)字。
//因?yàn)閷?duì)一個(gè)二維數(shù)組,可以不知道有多少行,但是必須知道一行多少元素。
//這樣才方便運(yùn)算。
void test(int* arr)//ok?--No
{}
void test(int* arr[5])//ok?--No//int* arr[5]是指針數(shù)組 根本不沾邊
{}
void test(int (*arr)[5])//ok?--Yes
{}
void test(int** arr)//ok?--No
{}
int main()
{int arr[3][5] = {0};test(arr);
}
有前面的分析,很容易知道可以這樣寫void test(int arr[3][5]){}
二維數(shù)組傳參,函數(shù)形參的設(shè)計(jì)只能省略第一個(gè)[]
的數(shù)字,即行可以省略,列不能省略。
因?yàn)閷?duì)一個(gè)二維數(shù)組,可以不知道有多少行,但是必須知道一行多少元素。
這樣才方便運(yùn)算。
所以void test(int arr[][]){}
這樣寫不行,
應(yīng)該void test(int arr[][5]){}
這樣寫。
我們要知道,當(dāng)我們談二維數(shù)組首元素地址的時(shí)候,指的是它的第一行
對(duì)于arr[3][5]這個(gè)數(shù)組,本質(zhì)上是這樣的,arr有三個(gè)元素,每個(gè)元素是(有五個(gè)整型元素的)一維數(shù)組,我們說數(shù)組名表示首元素的地址,即第一行一維數(shù)組的地址,一維數(shù)組的地址就要用指向一維數(shù)組的指針來存放,即寫成void test(int (*arr)[5]){}
數(shù)組指針的形式。
解釋:arr是個(gè)指針,指向的是5個(gè)元素的數(shù)組,元素類型為int,(說明一下,(*arr)
如果不加()
,則arr會(huì)優(yōu)先跟[5]
結(jié)合,因?yàn)?code>[]優(yōu)先級(jí)更高)
不懂為什么這么寫的可以去看這篇博客數(shù)組指針(用幾個(gè)例子來看看用法)【點(diǎn)擊即可跳轉(zhuǎn)】
有人肯定在想,二維數(shù)組用二級(jí)指針可以嗎?即void test(int **arr){}
//ok?–No,當(dāng)然不行啦,雖然它們都帶有“二”,但二維數(shù)組和二級(jí)指針沒有任何關(guān)系噢
那void test(int* arr)
可以嗎?也不行。二維數(shù)組名傳過去的實(shí)際上是第一行一維數(shù)組的地址,這里就肯定不能用一個(gè)整型指針int* arr
來接收(要用數(shù)組指針),整型指針是用來存放整型變量地址的。
指針傳參
一級(jí)指針傳參
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9};int *p = arr;int sz = sizeof(arr)/sizeof(arr[0]);//一級(jí)指針p,傳給函數(shù)print(p, sz);return 0;
}
對(duì)于 print(p, sz);
我們傳參,函數(shù)print()的形參部分應(yīng)該怎么寫呢?
答案如下
void print(int *p, int sz)
我們要打印出來arr的元素,則整段代碼為
#include <stdio.h>
void print(int *p, int sz)
{int i = 0;for(i=0; i<sz; i++){printf("%d\n", *(p+i));}
}
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9};int *p = arr;int sz = sizeof(arr)/sizeof(arr[0]);//一級(jí)指針p,傳給函數(shù)print(p, sz);return 0;
}
有人肯定會(huì)問,一級(jí)指針用一維數(shù)組傳可以嗎?
即寫成
void print(int p[], int sz)
運(yùn)行一下
答案是:可以的。畢竟一維數(shù)組的本質(zhì)還是指針。但是不建議這樣寫,還是對(duì)應(yīng)寫成指針的形式比較好,一級(jí)指針傳過去就用一級(jí)指針接收比較好。
那接著我們思考一下
當(dāng)一個(gè)函數(shù)的參數(shù)部分為一級(jí)指針的時(shí)候,函數(shù)能接收什么參數(shù)?
比如:
void test1(int *p)
{}
test1函數(shù)能接收什么參數(shù)?
void test1(int* p)
{}
int main()
{int a;test1(&a);//整型的地址放到整型的指針里去,當(dāng)然是可以的
}
還能怎樣寫?
void test1(int* p)
{}
int main()
{int arr[10] = { 0 };test1(arr);
}
數(shù)組名代表首元素地址,arr元素是int型的,所以對(duì)應(yīng)上面int* p
也是可以的。
當(dāng)然,直接傳一級(jí)指針過去也是可以的
void test1(int* p)
{}
int main()
{int a;int* p1 = &a;test1(p1);
}
二級(jí)指針傳參
對(duì)于下面
int main()
{int n = 10;int*p = &n;int **pp = &p;test(pp);//傳的是二級(jí)指針變量return 0;
}
test(pp);
傳的是二級(jí)指針變量,那就用二級(jí)指針接收。
即
#include <stdio.h>
void test(int** ptr)
{printf("num = %d\n", **ptr);
}
int main()
{int n = 10;int*p = &n;int **pp = &p;test(pp);return 0;
}
思考一下,當(dāng)函數(shù)的參數(shù)為二級(jí)指針的時(shí)候,可以接收什么參數(shù)?
比如:
void test(int** ptr)
{}
test函數(shù)能接收什么參數(shù)?
當(dāng)然還可以這樣:
#include <stdio.h>
void test(int** ptr)
{printf("num = %d\n", **ptr);
}
int main()
{int n = 10;int*p = &n;int **pp = &p;//test(pp);test(&p);//一級(jí)指針變量的地址取出來放到二級(jí)指針里面去return 0;
}
當(dāng)然還可以這樣:
#include <stdio.h>
void test(int** ptr)
{printf("num = %d\n", **ptr);
}
int main()
{int* arr[10] = {0};test1(arr);
}
arr數(shù)組的元素類型是int*,數(shù)組名arr代表數(shù)組首元素的地址,即int*的地址,那么就可以放到二級(jí)指針里面去。即指針數(shù)組的數(shù)組名可以傳過去。
以上就是我總結(jié)的關(guān)于"數(shù)組傳參,指針傳參"的相關(guān)內(nèi)容
如果對(duì)你有幫助,別忘了點(diǎn)贊👍+收藏
歡迎大家的指導(dǎo)
我的主頁還有其他內(nèi)容,關(guān)注?我,我們一起學(xué)習(xí)一起成長(zhǎng)!