16.0、C语言——指针详解(2)

16.0、C语言——指针详解(2)

在设计 函数参数 时如何 传递指针类型 的参数?

void test(int arr[]){}
void test(int arr[6]){}
void test(int* arr){}
void test2(int* arr2[6]){}
void test2(int** arr2){}

int main() {
    int arr[6] = { 0 };
    int arr2[6] = { 0 };
    test(arr);
    test2(arr2);
    return 0;
}

        当传递的参数是指针数组的首地址的时候,注意这里形参是一个二级指针,
这里先回顾一下之前讲到 的指针定义的含义;

        int* pa = &a;   // int 是该指针指向变量的类型是 int 类型,' * ' 代表 pa 是一个指针变量,p 是指针变量名

        int** ppa = &pa;   // int*:该指针指向的变量类型是 int* 类型,' * ' :代表 ppa 是一个指针类型的变量,ppa 是变量名称 【ppa是一个二级指针】

......... 

        那么当一个指针数组作为参数传递给函数的时候,形参应该用二级指针 int** arr2 去接收,因为这里int*表示 arr2 指向的变量是一个 int* 类型的变量,第二个 ' * ' 表示这是一个指针变量,arr2 就是指针变量的名称

二维数组 如何传递参数:

一、中规中矩的写法:

test(int arr[3][5]) {}
int main(){
    int arr[3][5] = { 0 };
    test(arr);
    return 0;
}

二、省略行的写法:【这里记住只能省略行不能省略列,否则编译不通过】

test(int arr[][5]) {}
int main(){
    int arr[3][5] = { 0 };
    test(arr);
    return 0;
}

三、用指针形参接收:

test(int (*arr)[5]) {}
int main(){
    int arr[3][5] = { 0 };
    test(arr);
    return 0;
}

函数指针:

        我们知道数组名其实就是首元素地址;【只不过 &arr 表示整个数组的地址,而 arr 只是首元素地址】
        函数也类似 -> 函数名 就是 函数的地址,通过验证可以发现 &函数名 == 函数名;

        那么定义一个函数指针的方式也跟数组指针很相似 ->  int ( *padd ) ( int , int ) = add;代码如下所示 ->

int add(int a,int b) {
	return a + b;
}
int main() {
	int(*padd)(int, int) = add; //将add()函数的地址赋值给 padd 函数指针
	int ret = (*padd)(5, 5); //*padd相当于函数名,然后传参调用该add()函数
	printf("ret = %d",ret); //打印出来的结果的确是 10
	return 0;
}

在定义的语句中 :int ( *padd ) ( int ,  int ) = add;

        1、第一个 int 表示 add() 函数返回的类型是 int 类型【如果返回值类型是 char 这里就写char,如果是 void 就写 void】
        2、' * ' 表示该变量是一个指针变量【这里由于' * ' 的优先级比后面 ( ) 要低,所以定义的时候要用()括起来,不然变量名会先与后面的 ( ) 相结合变成一个函数】
        3、padd 是指针变量名
        4、后面两个 int 表示 add() 函数的形参类型        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值