1.函数的定义
返回数据类型 函数名(【形式参数说明表】)
Int main(int argc ,char *argv[])//char *argv[]等同char** argv
一个进程的返回值是给父进程看的。
1.5声明
返回值类型 函数名(【形参说明表】)
因为按顺序执行,如果后写的函数被前面调用,则要先在外部声明。
2.函数的传参
赋值传参(int a)
地址传参(int *a)
传递时发过来的应该是地址;
3.调用
嵌套调用
递归调用
4.函数与数组
形参表: 返回值类型 函数名(int *p)或者(int p[])两者的含义都是指针。
传参实参: 函数名(数组名);
特殊: 实参的数组的sizeof大小,和形参p指针sizeof大小是不同的。
所以函数要用到数组大小的话,要先把数组的大小当参数传递过来。
4.1一维数组
Int a[]={1,2,3,4,5};
Int *p=a;
实参 | a | *a | a[0] | &a[3] | p[i] | p | *p | p+1 |
形参类型 | int* | int | int | Int * | int | Int* | int | Int* |
4.2二维数组
#define M 3
#define N 4
Int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
1.一维数组传递形式
调用: Print_arr(*arr,sizeof(a)/sizeof(a[0][0])); //或者&arr[0][0]。而arr错误
定义: void print_arr(int *p , int n )
2.行列的形式:指向行的指针
调用:print_arr(arr ,M ,N);
定义: print_arr(int (*p)[N], int m ,int n)//指针数组,指向数组的指针
输出:printf("",*(*(p+i)+j));
3.二维数组型:其实其和2的本质都一样,形参p[][]其实还是一个指针
调用:同2
定义:print_arr(int p[][N], int m,int n)
输出:printf("%4d",p[i][j]);
Int a[M][N]={};
Int *p = *a;//把其当成长一维数组
Int (*q)[N] = a;//使用数组指针,指向数组
实参 | a[i][j] | *(a+i)+j | a[i]+j | ||
形参类型 | int | Int* | Int * |
实参 | p[i] | *p | p+3 | ||
形参类型 | int | Int | Int * |
//p[i]一级指针的一个元素。p+3列地址
实参 | q[i][j] | *q | q | q+2 | |
形参类型 | int | Int* | Int(*)[N] | Int (*)[N] |
//*q意味*(q+0),第零行的列地址
//q+2行地址,所以用行指针接收
4.3函数与字符串数组
字符串的拷贝
#include <stdio.h>
#include <stdlib.h>
char *mystrncpy(char *dest,const char *src,size_t n)
{
int i;
for(i=0;i<n && (dest[i] = src[i]);i++)//字符串的一种交换方式
;
for(;i<n;i++)
dest[i] = '\0';//避免没有结束符
return dest;
}
char *mystrcpy(char *dest,const char *src)
{
char *ret =dest;//保证在有返回值的情况下返回正确的字符串
if(dest != NULL && src != NULL)
while ((*dest++ = *src++)!= '\0') //另一种字符串的交换方式
{
printf("%p\n",dest);
}
printf("dest,%p\n",dest);
return ret;
}
int main()
{
char str1[]="helloworld";
char str2[128];
char *str=NULL;
str = mystrcpy(str2,str1);
puts(str2);
puts(str);
exit(0);
}
5函数与指针
指针函数:类型是指针的函数
返回值 * 函数名 (形参)
Int * fun(int);
函数指针:指向函数的指针
类型(*指针名)(形参);
Int (*p)(形参)=函数名;
函数指针数组:指向函数的指针的数组
类型 (*数组名【下标】)(形参);
Int (*funcp[2])(int,int);
Funcp[0] = 函数名;
指向指针函数的函数指针数组
Int *(*funcp[N])(int)
main函数的形参查看
int main(int argc,char *argv[])
{
int i ;
printf("argc=%d\n",argc);
// for(i=0;i<argc;i++)
for(i=0;argv[i]!= NULL;i++)
{
puts(argv[i]);
}
return 0;
}
[tom@CentOS7 function]$ ./fun abd fgf 12 34 ek
argc=6
./fun
abd
fgf
12
34
ek
函数与一维数组数组:特殊
static void printf_arr(int p[],int n)//(int *p,int n)
{
int i;
printf("%s,%d\n",__FUNCTION__,sizeof(p));
for(i=0;i<n;i++)
{
printf("%d\n",*p+i);
}
}
int main()
{
int arr[]={1,2,3,4,5,6};
printf("%s,%d\n",__FUNCTION__,sizeof(arr));
printf_arr(arr,sizeof(arr)/sizeof(arr[0]));
exit(0);
}
main,24
printf_arr,8
1
2
3
4
5
6
二维数组
1.计算平均值。此时不区分行列,用一维数组形式就行。
2.输出第2行的值。此时区分行列,用指针数组。
#define M 3
#define N 4
static int average_a(int *p,int n)//形参指针指向一维数组
{
int i;
float sum=0;
for(i=0;i<n;i++)
sum += p[i];
return sum/n;
}
static void find_num(int(*p)[N],int num)//指针指向二维数组的行
{
int i;
for(i=0;i<N;i++)
{
printf("%d",*(*(p+num)+i));
}
printf("\n");
}
int main()
{
int i;
int a[M][N]={1,2,3,4,5,6,7,8,9,10,11,12};
float ave;
int n =1;
ave = average_a(*a,M*N);
printf("%f\n",ave);
find_num( a,n );
exit(0);
}
[tom@CentOS7 function]$ make funarrb
cc funarrb.c -o funarrb
[tom@CentOS7 function]$ ./funarrb
6.000000
5678