(1)一维数组的传参:
void func(char *pStr);
void func(char pStr[]);
注意:数组作为参数传参时,会被退化成一个指针来使用。
(2)二维数组的传参:
void func(int M,int N,char (*pStr)[N]);
void func(int M,int N,char pStr[][N]);
(3)main函数传参:
#include <stdio.h>
2
3 int main(int argc,const char argv[])
4 {
5 int i;
6 printf(“参数为以下:\n”);
7 for(i=0;i<argc;i++)
8 {
9 //puts(argv[i]);
10 printf(“argv[%d] =”,i);
11 puts((argv+i));
12 }
13 return 0;
14 }
运行结果如下:
linux@ubuntu:~/21051_C/day9$ ./a.out wangjia haha xixi lll
参数为以下:
argv[0] =./a.out
argv[1] =wangjia
argv[2] =haha
argv[3] =xixi
argv[4] =lll
(4)函数指针:指向函数的指针、
4-1:函数指针的定义:
格式:
返回值类型 (*指针变量名) (形参类型1,形参类型2。。。)
如果要去使用高函数指针:
则:指针变量名 = 地址;
指针变量名 = 函数名(&函数名)
函数: 存在于内存中的一段二进制代码(本质)
数组名:代表函数的入口地址
4-2:函数指针的声明
关键字:
typedef:作用:给一个已经存在的数据类型取一个别名
分析函数指针的类型:
eg:
int (pFunc)(int,int);
pFunc的类型?
----》去掉变量名,剩余的均是该指针的类型
int ()(int,int) ---->该pFunc自己的类型
问题:能够给该类型取一个别名?—》typedef 可以做到
eg:
typedef int (*)(int,int) MFunc ; (不会识别)
typedef int (MFunc)(int,int); (相当于给int ()(int,int)取一个别名叫MFunc)
4-3:回调函数:
概念:将一个函数名作为参数传递给另外一个函数,在另外一个函数中通过该函数指针完成对该函数的调用即为回调函数
(通过函数指针调用的函数)
4-4:函数指针数组:
格式:
回顾定义数组?
----》数据类型 数组名[元素个数];
格式:
格式1:返回值类型 (*数组名[元素个数]) (形参类型1,形参类型2。。。))
格式2:函数指针类型别名 数组名[元素个数];
(5)指针函数:
概念: 函数返回值类型是指针类型的函数
堆区:程序员手动管理的一片区域(管理:申请和释放)
对于申请和释放:通过系统提供的接口函数来实现
申请:malloc
释放:free
分析函数三步走:
功能,参数,返回值
头文件:
#include <stdlib.h>
函数原型:
void *malloc(size_t size);
功能:用来在堆区动态申请一片内存空间
参数:代表需要申请的空间的字节数
返回值:代表是一个万能指针,需要程序员强制类型转换方可使用。
成功:返回值代表那片空间的首地址
失败:NULL代表失败
void free(void *ptr);
功能:用来释放一片连续的空间
参数:空间首地址
void *realloc(void *ptr, size_t size);
功能:用来给一片空间进行扩容
参数:
参数1:需要扩容的空间的首地址
参数2:所需扩容的总字节个数(旧+新)
返回值:扩容成功之后的空间首地址