一维数组的传参: 当传入的数组名看成是一个数组时,可以直接用一个数组去接收,数组的大小可以不写; 当传入的数组看成是元素的首地址的时候,那么便可以用一个指针去接收 int* p (*代表是一个指针的符号,p是传入的地址)
指针数组(int* arr[])一个存放指针的数组,存放的也就是一些地址,前面的类型是地址变量指向的类型: 传参 同样如果传入的数组被看做数组名可以直接用一个指针数组去接受(int* arr[])大小可以不写(但最好写)如果是元素的首地址,那么便需要用一个二级指针去接收,因为传入的地址是指针的地址(int**arr)
二维数组的传参:跟一维数组一样,接收的时候可以用二维数组接收,接收时最好定义一下大小,二维数组当成首地址传入时,传入的就是一个一维数组的首地址,那么便要用一个数组指针去接收
(int (*p)[n]) 先定义一个指针,该指针指向的是一维数组的每个元素,每个元素是int型的
一级指针可以接收的: 变量的地址,一位数组的数组名
二级指针可以接收的: 一级指针的地址,二维数组的数组名,二级指针
函数指针:指向函数的指针,跟定义数组指针一样先定义一个指针然后再看他后面指向的内容,每个内容的类型是什么
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
一维数组传参的接收方式
int arr[10] = {0};
test(arr);
传入数组
void test(int arr[])
void test(int arr[10]) 传入的是一个数组,那么我便用一个数组去接受(里面有无大小是另外的关系)
void test(int* arr)// 传入的是首元素的地址,该元素的类型为int 所以用一个int的指针接收它
int* arr2[10] = { 0 }; //指针数组 ,每个数组元素存放的是一个指针
test(arr2)
传入数组
void test(int* arr[10])
void test(int* arr[])
void test(int* *arr) // 传入首元素的地址,首元素的类型为指针,所以用一个指针接收它
传入什么就用什么去接收,可以不考虑大小,如果传入的看做是首元素的大小那么就用一个指针去接收它 定义一个指针就是加个*
void test(int* p, int x) {
for (int i = 0; i < x; i++) {
printf("%d", *(p + i)); // 将地址解引用打印出来
}
}
int main(){
int arr[10] = { 1,2,3,4,5,3,1,63 };
/*int* p = arr;*/ // 可以定义一个指针传入,也可以直接将数组名传入,数组名为首元素的地址
int sz = sizeof(arr) / sizeof(arr[0]);
test(arr, sz);
}
二维数组传参
int arr[3][5]={0};
test(arr);
传入参数
void test(int arr[3][5]) 传入一个二维数组,那么我变用一个二维数组去接收(大小可以不用写)
void test(int* arr) 错误 如果看做地址 我/*传入的是是一个一位数组的地址(即一行的地址)不能用一个int型的指针来接收,只能接收一位数组的地址(还要是int类型的)
void test(int (*arr)[5]) 可以 传入的是一位数组的地址我用一个指针去接受该地址接大小为5 也可以不写大小,每个元素为int型,要用括号将*arr括起来不安然就跟上面一样只是多了大小
void test(int **arr)错误 传入的不是一个指针的地址 而是一个数组的地址 所以不能用二级指针去接受该地址
一级指针可以接收的东西
void test(int* p) {}
int a = 10;
int* p = &a;
test(p); 变量的地址
int arrp[10] = { 0 };
test(arrp); 一维数组的数组名
int* p = arr;
test(p); 一级指针变量
二级指针可以接收的东西
* void test(int**p) 接收一级指针的地址和二级指针
*
* int*p;
* int**p1 =&p;
* test(*p1); 一级指针的地址
* test(p1) 二级指针
* int* arr[10];
* test(arr) 指针数组的首地址
函数指针- 指向函数的指针
int print(int x,int y){
return x+y;
}
int main() {
void(*p)(int,int)= print =&print 这里不存在函数的首地址 定义函数指针时先定义一个指针*p然后它指向的是一个函数的参数(int x,int y)然后返回类型是int
(*p)(x,y)
}
void *pfun() 这里应该是pfun是一个函数名 返回的类型是void*
void (*pfun)() 这里是一个函数指针,*pfun指向的是一个函数里面没有参数,返回的是一个void的类型 */
void add(int x,int y){
return x+y;
}
int main(){
int a=0;
int b=0;
int (*P)(int,int)=add;
(p)(2,3) //利用指针函数调用函数时 有*无*都是一样的
}
int (*p)(int x,int y)=arr; 这里不存在首地址 &arr和arr 一样的