指针参数&数组参数

指针参数&数组参数

一.数组传参

1.一维数组传参

下面列出了一维数组传参的几种形式,判断一下谁对谁错

#include <stdio.h>
void test(int arr[])//ok?  1
{}
void test(int arr[10])//ok?  2
{}
void test(int *arr)//ok?   3
{}
void test2(int *arr[20])//ok?   4
{}
void test2(int **arr)//ok?   5
{}
int main()
{
int arr[10] = {0};
int *arr2[20] = {0};
test(arr);
test2(arr2);
}
  1. 1,2,3是用test函数传入了arr数组.
    1,2,3都是正确的,因为一维数组传参既可以用一维数组接收,也可以用指针接收(指针指向的是数组的首元素),此外用来接收函数传参的一维数组可以省略参数(验证了1的正确性)

  2. 4,5是用test2函数传入了arr2数组
    arr2是一个指针数组,其中存放了20个类型为int*的指针变量,利用test2函数传参arr2数组,可以用数组指针接收(如4),也可以用二级指针接收(如5),因为arr2传入的是一级指针的地址,需要使用二级指针接收.(验证了4,5的正确性)

2.二维数组传参

下面依然列出了一维数组传参的几种形式,判断一下谁对谁错

void test(int arr[3][5])//ok?  1
{}
void test(int arr[][])//ok?  2
{}
void test(int arr[][5])//ok?  3
{}
//总结:二维数组传参,函数形参的设计只能省略第一个[]的数字。
//因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。
//这样才方便运算。
void test(int *arr)//ok?  4 
{}
void test(int* arr[5])//ok?  5  指针数组
{}
void test(int (*arr)[5])//ok?  6  数组指针
{}
void test(int **arr)//ok?  7
{}
int main()
{
int arr[3][5] = {0};
test(arr);
}

上述代码是利用test函数传入二维数组arr

  1. 首先1-3函数都是想利用二维数组接收参数.
    但是由于二维数组传参函数形参的设计只能省略第一个[]的数字,因此2错误,1,3正确

  2. 然后4-7函数都是想利用指针的形式接收参数
    二位数组传参传入的是数组首元素的地址,也即第一行元素的地址,需要用数组指针来接收,且指向第一行的五个元素,因此4,5错误6正确.7是用二级指针接收,也不符合要求,故7错误.

二.指针传参

1.一级指针传参

#include <stdio.h>
void print(int *p, int sz)
{
  int i = 0;
  for(i=0; i<sz; i++)
  {
    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]);
//一级指针p,传给函数
print(p, sz);
return 0;
}

一级指针传参,形参就用一级指针接收
那如果当函数的参数是一级指针的时候可以接受什么参数?

void test(char* p)
{}
int main()
{
 char ch='2';
 char* ptr=&ch;
 char arr[]="abcdef";
 test(&ch);
 test(ptr);
 test(arr);
}

2.二级指针传参

#include <stdio.h>
void test(int** ptr)
{
   printf("num = %d\n", **ptr);
}
int main()
{
int n = 10;
int*p = &n;
int **pp = &p;
test(pp);
test(&p);
return 0;
}

二级指针传参,形参就用二级指针接收
那如果当函数的参数是二级指针的时候可以接受什么参数?

void test(char** p)
{
}
int main()
{
char n='a';
char* p=&n;//一级字符指针
char** pp=&p;//二级字符指针
char* arr[5];//指针数组
test(&p);
test(pp);
test(arr);

}

总之,函数传入的参数类型要与形参类型相对应

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值