什么是指针?
- 指针就是一个变量,用来存放地址,地址唯一标识一块内存空间
- 指针的大小是固定的4/8个字节(32位平台/64位平台)
常见的指针都有哪些?
- 字符指针
- 数组指针
- 指针数组
- 函数指针
- 回调函数
1.字符指针
字符指针类型char*,用法如下:
int main()
{
//字符指针两种使用方式
//第一种
char ch = 'h';
char *p1 = &ch;
*p1 = 'h';
//第二种
char* str = "hello";
//这里是把字符串"hello"的首地址放到str中
printf("%s\n", str);
syetem("pause");
return 0;
}
2.指针数组/数组指针
指针数组:是一个存放指针的数组
数组指针:能构指向数组的指针
//指针数组是存放指针的数组
int* arr1[10];//整形指针的数组
char* arr2[5];//一级字符指针的数组
char* arr3[6];//二级字符指针数组
//////////////////////////////////
//数组指针
int(*p)[10];
注意:p先和*结合,说明p是一个指针变量,指向一个大小为10个整形的数组,所以
p是一个指针,指向一个数组,所以叫数组指针。(这里注意[ ]的优先级高于 * 的,
所以要加上( )来保证 p 先和 * 结合)
Tip:1.arr 和 &arr 的区别
arr 是数组名,表示数组元素的首元素地址
&arr 是指向整个数组的地址
2.二维数组传参
二维数组传参,函数传参的设计只能省略第一个 [ ] 的数字,
扫描二维码关注公众号,回复:
5855054 查看本文章
3.函数指针
void test()
{
printf("hello\n");
}
int main()
{
printf("%p\n", test);
printf("%p\n", &test);
system("pause");
return 0;
}
输出结果:
00F91276
00F91276
请按任意键继续. . .
上代码输出两个地址,都是test函数的地址,想要将函数指针保存起来可用以下方法
void test()
{
printf("hello\n");
}
void (*pfun)();
//pfun可以存放函数地址
特殊的:函数指针数组 int (*ptr[10])();
指向函数指针数组的指针 ((*(*prt)[10])(const char*))
viod test(const char* str)
{
printf("hello\n");
}
int main()
{
//函数指针pfun
void (*pfun)(const char*)=test;
//函数指针数组pfunarr
void (*pfunarr[1024])(const char* str);
pfunarr[0]=test;
//指向函数指针数组pfunarr的指针ppfunarr
((*(*prt)[10])(const char*))=&pfunarr;
return 0;
}
4.回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当
这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调
用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
//使用回调函数,模拟实现qsort(采用冒泡的方式)。
#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;
}