C语言进阶:指针的进阶(3)

编辑: admin 分类: c#语言 发布时间: 2021-12-12 来源:互联网
目录
  • 数组传参和指针传参
    • 一维数组传参
    • 二维数组传参
    • 一级指针传参
    • 二级指针传参
  • 总结

    数组传参和指针传参

    实践之中不免会碰到数组和指针作函数参数而如何设计形参的问题。

    一维数组传参

    一维数组传参,下列接收方式是否可行呢?

    //1.
    void test(int arr[]) 
    {}
    //2.
    void test(int arr[10]) 
    {}
    //3.
    void test(int* arr) 
    {}
    int main()
    {	
    	int arr[10] = { 0 };
    	test(arr);
    	return 0;
    }
    

    1.数组传参数组接收,可行但其实都会降级优化成指针,编译器不会真正创建一个数组。

    2.由于形参数组形同虚设,所以数组大小无意义,任意大小或无。(有歧义)

    3.数组传参本质就是首元素地址,首元素类型为int,所以指针的类型为int*。

    所以可以看出[]和*()是等价的。我愿称之为*和[]的爱恨情仇!(‐^▽^‐)

    //1.
    void test2(int* arr[2])
    {}
    //2.
    void test2(int** arr) 
    {}
    int main()
    {	
    	int* arr2[10] = { 0 };
    	test2(arr2);
    	return 0;
    }
    

    指针数组,每个元素类型为int*,故用二级指针接收数组名。

    一维数组传参,数组和指针接收。

    二维数组传参

    //1.
    void test(int arr[3][5]) 
    {}
    //2.
    void test(int arr[][])
    {}
    //3.
    void test(int arr[][5])
    {}
    int main() {
    	int arr[3][5] = { 0 };
    	test(arr);
    }
    
    • 二维数组传参用二维数组接收,行可省略,但列不可以
    //4.
    void test(int* arr)
    {}
    //5.
    void test(int* arr[5])
    {}
    //6.
    void test(int(*arr)[5])
    {}
    //7.
    void test(int** arr)
    {}
    int main() {
    	int arr[3][5] = { 0 };
    	test(arr);
    }
    

    4.整型指针接收的应该是整型变量的地址,而二维数组数组名为首行的数组地址。

    5.指针数组和二维数组无关。

    6.二维数组传参用首行数组大小的数组指针接收。

    7.二级指针和二维数组无关。

    • 二维数组数组名arr为首行“一维数组”的地址,数组的地址用数组指针接收。

    int(*)[5]型数组指针指向元素个数为5的一维数组。指针+1访问到下一行,每次跳一行。再解一层引用访问一行里每个元素。

    一级指针传参

    反向思考,若函数形参为指针,传参时实参可以如何设计呢?

    void test(int* ptr, int sz)
    {}
    void test(int arr[],int sz)
    {}
    int main()
    {
        //1.
        int a = 10;
        test(&a);
        //2.
    	int arr[10] = { 0 };
    	test(arr);
    	return 0;
    }
    
    • 一级指针传参,形参用指针和数组都行,但不提倡用一维数组。
    • 若形参为指针,实参也可以是指针(地址),也可以是数组。

    二级指针传参

    当二级指针作参数时,形参如何设计呢?

    void test(int** pp) {
    	printf("%d\n", **pp);
    }
    void test(int* arr[]) {//用法不好
    	printf("%d\n", *arr[0]);
    }
    int main() {
    	int a = 10;
    	int* p = &a;
    	int** pp = &p;
    	test(pp);
    	return 0;
    }
    
    • 当二级指针作函数参数时,形参可以是二级指针和指针数组。

    当形参为二级指针,实参可以传什么呢?

    void test(int** pp) {
    	printf("%d\n", **pp);
    }
    int main() {
    	int a = 10;
    	int* p = &a;
    	int** pp = &p;
    	int* arr[10] = { &a };
        //1.
    	test(&p);
        //2.
    	test(pp);
        //3.
    	test(arr);
    	return 0;	
    }
    
    • 当形参为二级指针时,实参可以是:二级指针(一级指针地址),指针数组首元素的地址。

    总结

    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注海外IDC网的更多内容!

    【文章出处:国内服务器】