前言
在寫代碼的時候難免要把【數組】或者【指針】傳給函數,
那函數的參數該如何設計呢?
數組傳參
一維數組傳參
兩種形式 - - - 傳值和傳址
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 };//[int*][int*]……[int*]
test(arr);
test2(arr2);
return 0;
}
二維數組傳參
函數形參的設計隻能省略一個 [ ] 的數字,列不能省;因為對一個二維數組,可以不知道有多少行,但是必須知道一行多少元素。這樣才友善運算。
void test(int arr[3][5])
{}
void test1(int arr[][5])
{}
下面是錯誤舉例
void test2(int arr[3][]) //error - 不能省略列
{}
void test3(int *arr) //error - 這接收的是一維數組
{}
void test4(int **arr) //error
{}
int main()
{
int arr[3][5] = { 0 };
test(arr);
test1(arr);
//test2(arr);
//test3(arr);
//test4(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]);
//一級指針p,傳給函數
print(p, sz);
return 0;
}
思考:當函數的參數為一級指針的時候,能接收什麼參數?
void test1(int* p)
{}
void test2(char* p)
{}
int main()
{
int a = 10;
int* p1 = &a;
test1(&a); //ok
test1(p1); //ok
char ch = 'w'; //ok
char* pc = &ch; //ok
test2(&ch);
test2(pc);
return 0;
}
void test1(int* p) - 函數接收的是a的位址,利用指針,再對其解引用就能拿到p裡面的資料。
二級指針傳參
#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);
return 0;
}
思考:當函數的參數為二級指針的時候,可以接收什麼參數?
void test(int** ppa)
{}
int main()
{
int a = 10;
int* pa = &a;
int** ppa = &pa;
test(ppa);
test(&pa);
return 0;
}
void test(int** ppa) - 函數接收的是一級指針的位址,用二級指針接收,需要兩次解引用才能拿到a的資料。
預告
下一章 - - - 函數指針