指针进阶-数组参数、指针参数

数组参数,指针参数

在设计函数的时候,参数可以写成数组,也可以写成指针。

一维数组传参

void test(int arr[])
{}
void test(int arr[10])
{}
void test(int *arr)
{}
void test2(int *arr2[20])
{}
void teat2(int **arr2)
{}
int main()
{
    int arr[10]={0};
    int *arr2[20]={0};
    test(arr);
    test2(arr2);
    return 0;
}

上面代码,第一个void没有问题,数组传参,用数组接收。 第二个void也没有问题,“10”没有太大的意义,可写可不写。 第三个void,数组传参,传的是首元素的地址,用指针接收,且指针类型正确,没有问题。 第四个void,arr2是一个存放指针的数组,用指针数组接收,没问题。 第五个void,数组名是首元素的地址,类型是int* ,用一个二级指针来接收,没有问题。

二维数组传参

void test(int arr[3][5])
{}
void test(int arr[][5])
{}
void test(int arr[][])
{}

void test(int *arr)
{}
void test(int *arr[5])
{}
void test(int (*arr)[5])
{}
void test(int **arr)
{}

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

上面代码,前两个void都没有问题,实参是数组,形参也是数组,行可以省略,但是必须知道一行有多少个元素,所以列不可以省略,所以第三个void错误。 第四个void不行,数组名表示首元素地址,是第一行的地址。应该写成第六个void的形式。 第五个void不行,实参是首元素的地址,形参却是一个指针数组。 第六个void不行,实参是地址,但不是指针的地址,与二级指针不匹配。

一级指针传参

//用一级指针接收
void print(int* ptr, int sz)
{
    for(int i=0; i<sz; i++)
    {
        printf("%d ", *(ptr+i));
    }
}
int main()
{
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    int* p=arr;
    int sz=sizeof(arr)/sizeof(arr[0]);
    print(p, sz);
    return 0;
}

一个函数的参数是一级指针,那它能接收什么参数呢?

1、可以接收与参数指针类型相同的地址。

test(&ch);

2、可以接收存放了相同类型地址的一级指针。

test(p);

二级指针传参

void test(int** pa2)
{
    **pa2==20
}
int main()
{
    int a=10;
    int* p=&a;
    int** pa=&p;
    test(pa);
    printf("%d", a);
    return 0;
}

一个函数的参数是二级指针,那它能接收什么参数呢?

1、传一级指针的地址。

test(&p);

2、存放一级指针数组的数组名。

全部评论

相关推荐

jack_miller:杜:你不用我那你就用我的美赞臣
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务