朋友們,到站啦!指針進階第四站:傳參問題
0.引例
自定義函數(shù)里形參的類型,要和函數(shù)調(diào)用中傳過去的實參類型相對應
test函數(shù)里的是int類型,我們傳過去的參數(shù)a也是int類型
void test(int n)
{}
int main()
{
int a=1
test(a);
return 0;
}
好了,現(xiàn)在你已經(jīng)知道了函數(shù)傳參的基本概念了吧!
那么就來分析一下數(shù)組傳參、指針傳參的代碼吧!
1、一維數(shù)組傳參
看看以下函數(shù)的代碼示例
你覺得誰是正確的,誰是錯誤的呢?
include
void test(int arr[])
{}
void test(int arr[10])
{}
void test(int *arr)
{}
void test2(int *arr[20])
{}
void test2(int **arr)
{}
int main()
{
int arr[10] = {0};
int *arr2[20] = {0};
test(arr);
test2(arr2);
return 0;
}
NO.1 形參使用數(shù)組的形式來接收,正確
NO.2 同樣是數(shù)組的形式,正確
需要注意的是,數(shù)組傳參并不會開辟一個新的數(shù)組
所以函數(shù)[ ]里的數(shù)字是多少并不影響
NO.3 數(shù)組名是首元素的地址,用指針接收,正確
NO.4 arr2是一個指針數(shù)組,(int *arr[20])和原數(shù)組對應,正確
NO.5 數(shù)組名是首元素地址,arr2的首元素是一個int*類型
可以用二級指針來接收,正確!
2、二維數(shù)組傳參
了解完一維數(shù)組了,那就來看看二維數(shù)組
以下的函數(shù)傳參,哪些是對的,哪些是錯的呢?
void test(int arr[3][5])//一一對應,正確!
{}
void test(int arr[][])//省略列,錯誤!
{}
void test(int arr[][5])//可以省略行,正確!
{}
void test(int *arr)//二維數(shù)組的首元素是第一行
{}//第一行是int(*)[5]類型,錯誤!
void test(int* arr[5])//指針數(shù)組,錯誤!
{}
void test(int (*arr)[5])//數(shù)組指針,正確!
{}
void test(int **arr)//arr不是一級指針的地址,錯誤!
{}
int main()
{
int arr[3][5] = {0};
test(arr);
return 0;
}
根據(jù)二維數(shù)組傳參的代碼,復習以下知識點
(1)二維數(shù)組的首元素是第一行
(2)二維數(shù)組在定義的時候可以省略行,不能省略列
第一行的類型是int[5],應該放進數(shù)組指針里!
3、一級指針傳參
void print(int *p, int sz)//用int*來接受
{
int i = 0;
for(i=0; i
{
printf("%d ", *(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]);
print(p, sz);//一級指針p,傳給函數(shù)
return 0;
}
4、二級指針傳參
以下是二級指針傳參的基本形式
pp是int**類型,而&p是指針變量的地址,要用二級指針來接收
void test(int** ptr)
{
printf("num = %d ", **ptr);
}
int main()
{
int n = 10;
int*p = &n;
int **pp = &p;
test(pp);
test(&p);
return 0;
}
再來看如下代碼
&p、pp、arr這三個參數(shù)的類型都是二級指針
test函數(shù)里面要用char**來接收
void test(char** p)
{}
int main()
{
char ch = 'w';
char* p = &ch;
char** pp = &p;
char* arr[5];
test(&p);
test(pp);
test(arr);
return 0;
}
arr是指針數(shù)組的數(shù)組名,數(shù)組名是數(shù)組首元素的地址
數(shù)組的首元素是char*類型,所以要用二級指針來接收
5、如何判斷參數(shù)類型
如果我們在寫代碼的時候,不缺定應該用什么類型來接收的時候
可以寫一個測試代碼,VS編譯器會報錯“類型不一致”
結(jié)語
傳參問題并不算非常難,但我們?nèi)砸炀氄莆?/p>
這樣才能避免在寫自定義函數(shù)的時候出現(xiàn)參數(shù)類型不同的bug!
第四站數(shù)組傳參到這里就結(jié)束啦!
審核編輯:湯梓紅
-
指針
+關(guān)注
關(guān)注
1文章
484瀏覽量
71037 -
代碼
+關(guān)注
關(guān)注
30文章
4891瀏覽量
70306 -
數(shù)組
+關(guān)注
關(guān)注
1文章
419瀏覽量
26394
原文標題:【C語言】指針進階第四站:數(shù)組/指針的傳參問題!
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
C語言中指針數(shù)組和數(shù)組指針的區(qū)別
指針與數(shù)組的詳細資料和實例程序免費下載

C語言總結(jié)_數(shù)組與函數(shù)傳參練習題
【C語言進階】“數(shù)組指針”和“指針數(shù)組”都是啥跟啥?
C語言數(shù)組元素的指針
C語言中什么是指針數(shù)組
數(shù)組與指針不能混用的情況
面試常考+1:函數(shù)指針與指針函數(shù)、數(shù)組指針與指針數(shù)組

評論