目录
数组传参
一维数组
二维数组
指针传参
一级指针
二级指针
一个特殊的二级指针
我们把传入一维数组时输入的是数组名,数组名是一个指向首元素的指针
那么在函数接收时,只需要保证传入地址的类型相同即可
#include
void test(int arr[]) {} //int arr[] 可以看成int *arr
void test1(int arr[10]){} //传入的是指向首元素的地址,和[]内的值无关
void test2(int* arr){} //一个int*类型的指针
int main(void) {
int arr[10] = { 0 };
test(arr); //将arr看成指针,指向第一个元素,类型是int*
test1(arr);
test2(arr);
return 0;
}
我们传入二维数组时输入的也是数组名,数组名是一个指向首元素的地址,但这里首元素看成一个一维数组
int arr[3][5] = {
{1,2,3,4,5}, //首元素 arr表示的是该一维数组的地址
{2,3,4,5,6}, //第二个元素
{3,4,5,6,7} //第三个元素
};
同样将arr看成一个指针,是一个指向数组的指针,也就是数组指针,类型为int(*)[5]。
那么在函数接收时,只需要保证传入地址的类型相同即可
#include
void test(int arr[3][5]) {} //int arr[][5] 可以看成int(*)[5]
void test1(int arr[][5]) {} //传入的是指向首元素(数组)的地址,和第一个[]内的值无关
void test2(int(*arr)[5]) {}
//*arr=arr[0],*(arr+i)=arr[i]
//*(arr[i]+j)=arr[i][j]
//*(*(arr+i)+j)=arr[i][j]
//关于[]的作用可以看之前数组指针那篇
int main(void) {
int arr[3][5] = {
{1,2,3,4,5}, //首元素 arr表示的是该一维数组的地址
{2,3,4,5,6}, //第二个元素
{3,4,5,6,7} //第三个元素
};
test(arr); //将arr看成指针,指向第一个元素(数组),类型是int(*)[5]
test1(arr);
test2(arr);
return 0;
}
一级指针传入函数时是传地址,也就是指针,接收时只要类型相同即可。
#include
void test(int* p) {} //二者都是int*类型的指针
void test1(int p[]) {}
void test2(char* p) {} //二者都是char*类型的指针
void test3(char p[]) {}
int main(void) {
int a = 10;
int* p = &a;
test(p);
test1(&a);
char b = 'w';
char* p1 = &b;
test2(p1);
test3(&b);
return 0;
}
函数接收的时候是一个二级指针,参数类型是二级指针即可,只要是元素往上两级的地址都行。
void test(int** p) {} //int**类型
int a = 0;
int* p = &a;
int** p1 = &p;
test(&p); //指针往下两级是一个元素或空都行
test(p1);
之前在数组指针里有说到过,可以把数组指针看成一个特殊的二级指针,其二级和一级的值相同。
#include
void test(int** p) {}
void test1(int(*p)[]){} //这里的10正常应该加上,这里为了演示二级指针特性没有加
int main(void) {
int arr[10] = { 0 };
int(*p)[10] = &arr;
test(&arr);
test(p);
test1(&arr);
test1(p);
return 0;
}