C语言指针还可以这样理解

什么是指针?

  1. 指针就是一个变量,用来存放地址,地址唯一标识一块内存空间
  2. 指针的大小是固定的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;
}

猜你喜欢

转载自blog.csdn.net/X_simple/article/details/89189598
今日推荐