⭐4. 数组传参和指针传参
一维数组传参
可以通过数组,也可以通过指针来接收,几种方法方式如下:
#include <stdio.h> int main() { int arr[10] = {0}; int *arr2[20] = {0}; test(arr); test2(arr2); }
①用数组来接收
void test(int arr[]) {}
②形参[]里的值可以省略,因为在这里没有意义因为传入的实际上是一个地址
void test(int arr[10]) {}
③用整型指针接收一个整型数组的首元素地址
void test(int *arr) {}
④用指针数组来接收指针,同理[ ]里的值可以省略,因为在这里没有意义
void test2(int *arr[20]) {}
⑤这里的意思是arr2[20]里每个元素是int*
然后又把arr2的首元素地址传入了函数,所以要用 **arr 来接收;
void test2(int **arr) {}
二维数组传参
同理也可以通过数组或者指针来接收:
#include <stdio.h> int main() { int arr[3][5] = {0}; test(arr); }
①用数组
void test(int arr[3][5]) {}
②这种方式不可以,行可以省略但是列不可以省略,和初始化二维数组是一样的
void test(int arr[][]) {}
②这种方式不可以,行可以省略但是列不可以省略,和初始化二维数组是一样的
void test(int arr[][]) {}
总结:二维数组传参,函数形参的设计只能省略第一个[ ]的数字。
因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。
这样才方便运算。
④这种方式错误,二维数组的首元素是第一行,传入的其实是一个一维数组的地址,不能用一个整型指针来接收
void test(int *arr) {}
⑤也不能这样,这是个整型指针数组
void test(int* arr[5]) {}
void test(int (*arr)[5]) {}
⑦这种方式错误,不能在此处用二级指针
void test(int **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) {} //test1函数能接收什么参数? void test2(char* p) {} //test2函数能接收什么参数?
答案如下:
void test(int *p) {} int main() { int a = 10; int* p1 = &a; int arr[10] = {0}; test(&a); test(arr); test(p1); test(NULL);//考虑清楚 return 0; }
二级指针传参
#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(char **p) { } int main() { char c = 'b'; char*pc = &c; char**ppc = &pc; char* arr[10]; test(&pc); test(ppc); test(arr); return 0; }