目录
1.数组参数,指针参数
在将【数组】或者【指针】传给函数时,函数的参数该如何设计?
1.1一维数组传参
形参部分可以是数组,可以是指针,总之要与实参部分对应。
#include <stdio.h>
int main()
{
int arr[10] = {0};
int *arr2[20] = {0};
test(arr);
test2(arr2);
}
1.数组传参数组接收
void test(int arr[])
{}
void test2(int *arr[20])
{}
2.数组传参指针接收
void test(int *arr)
{}
void test2(int **arr)
{}
1.2二维数组传参
形参部分可以是数组形式,也可以是数组指针。
int main()
{
int arr[3][5] = {0};
test(arr);
}
1.数组传参二维数组接收
void test(int arr[3][5])
{}
void test(int arr[][5])
{}
总结:二维数组传参,函数形参的设计只能省略第一个[ ]的数字。
因为对一个二维数组,可以不知道有多少行,但是必须知道一行多少元素。
2.数组传参数组指针接收
void test(int (*arr)[5])//指向的某一行
{}
1.3一级指针传参
void test(char* ch)
{}
int main()
{
char ch = "A";
char* pa = &ch;
char arr[] = "abcdef";
test(pa);//一级指针传参一级指针接收
test(ch);//字符变量地址传参一级指针接收
tset(arr);
return 0;
}
2.函数指针
先看一段代码
int Add(int x, int y)
{
return x + y;
}
int main()
{
int ret=Add(3, 5);
printf("%d\n", ret);
printf("%p\n", &Add);
printf("%p\n", Add);
return 0;
}
说明函数也是有地址的,并且函数名和&函数名都能取出函数地址。
如何保存函数地址呢?
1.书写格式:与数组指针类似
int(*pf)(int,int)
pf 是函数指针变量。
int(*)(int,int)是函数指针类型。
学习了函数指针有什么用呢?----------回调函数
3.回调函数
回调函数就是一个通过函数指针调用的函数。
3.1qsort函数
#include <stdio.h>
//qosrt函数的使用者得实现一个比较函数
int int_cmp(const void * p1, const void * p2)
{
return (*( int *)p1 - *(int *) p2);
}
int main()
{
int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
int i = 0;
qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);
for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)
{
printf( "%d ", arr[i]);
}
printf("\n");
return 0;
}
qsort函数的参数:
1.指向了需要排序数组的第一个元素
2.排序元素个数
3.一个元素的大小
4.函数指针类型
3.2使用回调函数,模拟实现qsort(采用冒泡的方式)。
#include <stdio.h>
int int_cmp(const void * p1, const void * p2)
{
return (*( int *)p1 - *(int *) p2);
}
void _swap(void *p1, void * p2, int size)
{
int i = 0;
for (i = 0; i< size; i++)
{
char tmp = *((char *)p1 + i);
*(( char *)p1 + i) = *((char *) p2 + i);
*(( char *)p2 + i) = tmp;
}
}
void bubble(void *base, int count , int size, int(*cmp )(void *, void *))
{
int i = 0;
int j = 0;
for (i = 0; i< count - 1; i++)
{
for (j = 0; j<count-i-1; j++)
{
if (cmp ((char *) base + j*size , (char *)base + (j + 1)*size) > 0)
{
_swap(( char *)base + j*size, (char *)base + (j + 1)*size, size);
}
}
}
}
int main()
{
int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
//char *arr[] = {"aaaa","dddd","cccc","bbbb"};
int i = 0;
bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);
for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)
{
printf( "%d ", arr[i]);
}
printf("\n");
return 0;
}