一、举例
int arr[5]; //arr是整型数组
int *parr1[10]; //parr1是整型指针数组
int (*parr2)[10] //parr2是数组指针
int (*parr3[10])[5] //parr3是存放数组指针的数组 注意*与[ ]的优先级关系
二、数组参数和指针参数
1.一维数组传参
数组传参形参的部分可以写成数组也可以写成指针。
例如:
#include <stdio.h>
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;
}
2.二维数组传参
二维数组传参,函数形参的设计只能省略第一个,因为对一个二维数组,可以不知道有多少行,但是必须知道有多少列,这样才方便运算。
#include <stdio.h>
void test(int arr[3][5]) //OK
{}
void test(int arr[][5]) //形参的二维数组,行可以省略,列不能省略
{}
//不可行,二维数组的数组名,表示首元素的地址,也就是第一行的地址
//第一行是一个一维数组
void test(int *arr)
{}
//不可行,arr先与[]结合,类型是int*,是一个指针数组
void test(int* arr[5])
{}
//OK
int test(int (*arr)[5])
{}
//不可行,二级指针是专门用来储存一级指针变量的地址
int test(int **arr)
{}
int main()
{
int arr[3][5] = {0};
test(arr);
}
3.一级指针传参
如果函数的参数部分是指针,传参时可以是地址,数组名,指针。(本质都为指针)
#include <stdio.h>
/*void print(int* p)
{}
int a = 10;
int* prt = &a;
int arr[10];
print(&a);
print(prt);
print(arr);*/
void print(int *p,int sz)
{
int i = 0;
for()
{
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]);
print(p,sz);
return 0;
}
4.二级指针传参
如果函数的形式参数是二级指针,调用函数的时候传参使用一级指针地址,指针数组的数组名,二级指针指针。(本质都为二级指针)
#include <stdio.h>
void test(int** prt)
{
printf("num = %d\n",**ptr);
}
int main()
{
int n = 10;
int *p = &n;
int **pp = &p;
int* arr[10];
test(pp);
test(&p);
test(arr);
return 0;
}
标签:arr,int,void,笔记,C语言,数组,test,指针
From: https://blog.csdn.net/a282828282/article/details/143477137