目录
1、字符指针
2、指针数组
3、数组指针
1、定义
2、&数组名VS数组名
3、数组指针的使用
1、二维数组的数组名
4、数组参数、指针参数
1、一维数组传参
2、二维数组传参
3、一级指针传参
4、二级指针传参
5、函数指针
6、函数指针数组
7、指向函数指针数组的指针
8、回调函数
1、字符指针
在指针的类型中我们知道有一种指针类型为:字符指针 char*,一般使用如下:
还有一种使用方式为:将一个常量字符串的首字符地址存放到指针变量中。
例如:
2、指针数组
指针数组是一个存放指针的数组。
3、数组指针
1、定义
数组指针:能够指向数组的指针。
例如:
2、&数组名VS数组名
&数组名:表示的是数组的地址。
3、数组指针的使用
1、二维数组的数组名
数组名是首元素地址,二维数组的首元素就是二维数组的第一行。
例如:
#include<stdio.h>
void print(int(*p)[5], int r, int l)
{
for (int i = 0; i < r; i++)
{
for (int j = 0; j < l; j++)
{
printf("%d ", (*(p+i))[j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
print(arr, 3, 5);
return 0;
}
注意:如果int arr[10],&arr,再对其解引用,即*(&arr) 相当于还是arr,相互抵消了。
总结:数组名arr,表示首元素的地址,但是二维数组的首元素是二维数组的第一行,所以这里传递的arr,其实相当于第一行的地址,是一维数组的地址,可以用数组指针来接收。
4、数组参数、指针参数
1、一维数组传参
一维数组传参,需要传数组名、数组元素个数。数组名是首元素地址,形参可以用数组形式接收,也可以用指针形式接收,但本质是指针。
例如:
2、二维数组传参
二维数组传参,需要传数组名、行、列。数组名是首元素地址,二维数组的首元素是第一行元素,形参可以用数组形式接收,也可以用指针形式接收,但本质是指针。
例如:
3、一级指针传参
4、二级指针传参
5、函数指针
函数指针就是存放函数地址的指针。
函数名是函数的地址,&函数名、函数名 是一样的。
例如:
函数指针的使用:存放函数地址,就是可以通过地址找到该函数,从而调用该函数。
例如:
注意:
6、函数指针数组
把函数的地址存到一个数组中,那这个数组就叫函数指针数组。
例如:
函数指针:int (*pf)(int,int);
函数指针数组:int (*pfArr[4])(int,int);
函数指针数组:可以存放多个参数相同、返回类型相同的函数的地址。
函数指针数组的用途:转移表。
7、指向函数指针数组的指针
指向函数指针数组的指针是一个指针,指针指向一个数组,数组的元素都是函数指针。
例如:
8、回调函数
回调函数就是一个通过函数指针调用的函数。
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
qsort:C语言标准库提供的排序函数(底层是快排),qsort可以排序任意类型的数据。头文件:#include<stdlib.h>。
为什么要提供一个比较函数?
答:对于2个整形,可以用关系运算符比较大小;对于结构体类型,就要提供一个比较函数了,因为要排序任意类型的数据,不同类型的数据有不同的比较方法,所以需要外面提供比较函数。
qsort的使用:
#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* p1, const void* p2)
{
return (*(int*)p1) - (*(int*)p2);
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_int);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
将冒泡排序实现成可以排任意类型的数据:
#include<stdio.h>
int cmp_int(const void* p1, const void* p2)
{
return (*(int*)p1) - (*(int*)p2);
}
void swap(char* buf1, char* buf2, int width)
{
int i = 0;
for (i = 0; i < width; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
void bubble_sort(void* base, int sz, int width, int (*cmp)(const void*, const void*))
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz,sizeof(arr[0]),cmp_int);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}