C语言的数组指针与函数指针详解

 更新时间:2022年03月10日 10:37:02   作者:无所不能的怪哥哥  
这篇文章主要为大家详细介绍了C语言的数组指针与函数指针,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

前言

数组指针和函数指针都是C语言比较难的知识点,尤其是函数指针,并且函数指针在开发中有着巨大的作用。

函数指针语法

定义一个函数指针,并通过函数指针间接调用函数:

int get_num(int a, int b)
{
    return a + b;
}
int (*func)(int a, int b); //定义了一个函数指针func,它指向 返回值为int 参数为 int a, int b的函数
func = &get_num; //函数指针指向函数
func(1, 2); //通过函数指针调用函数

通过定义一个函数指针类型来定义一个函数指针:

typedef int (*func)(int a, int b); //定义了一个函数指针类型
func func1 = &get_num; //使用函数指针类型func定义函数指针变量func1

定义一个函数类型,并使用函数类型来定义一个函数指针

typedef int (func)(int a, int b); //定义了一个函数类型
func* func1 = &get_num;
func1(1, 1); //间接调用

函数指针约定了函数的返回值和函数参数,功能开发者只要根据这个约定实现功能函数,就可以通过以函数指针为参数的统一接口进行调用,来使用这个函数的功能,实现了功能开发与功能使用的解耦合。这就是函数指针的巨大作用:函数指针做函数参数

另外函数指针的正向调用使用场景,比如通过把动态库加载到程序中,在动态库中查找到函数入口地址来调用函数。

数组指针与指针数组

数组指针是指向数组的指针;指针数组是指针的数组。

数组指针举例

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void PrintArray_int(int* array, int len)
{
	if ((NULL == array) || (len < 0))
	{
		printf("err:(NULL == array) || (len < 0)\n");
		return;
	}
	for (int i = 0; i < len; i++)
	{
		//两种方法访问数组元素
		//printf(" %d ", array[i]);
		printf(" %d ", *(array + i));
	}
	printf("\n");
}
int main()
{
	//定义一个数组变量
	int num_array[10];
	// num_array + 1 移动 sizeof(int) 个字节
	int len = sizeof(num_array) / sizeof(num_array[0]);
	//memset(num_array, 0, sizeof(num_array) / sizeof(num_array[0])); //典型错误,只把十个字节的内存值为0
	memset(num_array, 0, sizeof(num_array)); //实际应该把40个字节置为0
	PrintArray_int(num_array, sizeof(num_array) / sizeof(num_array[0]));
	//定义一个数组类型
	typedef int(array1_t)[];
	typedef int(array2_t)[10];
	array1_t a1 = {1, 2, 3};
	array2_t a2;
	for (int i = 0; i < 10; i++)
	{
		a2[i] = i;
	}
	PrintArray_int(a1, sizeof(a1) / sizeof(a1[0]));
	PrintArray_int(a2, 10);
	//定义一个数组指针
	int(*p_array)[10];
	// p_array + 1 移动 sizeof(int) * 10 个字节
	p_array = &num_array;
	for (int i = 0; i < 10; i++)
	{
		(*p_array)[i] = i + 1;
	}
	PrintArray_int(*p_array, 10);
	//定义一个指向数组的指针类型(数组指针)
	typedef int(*p_array_t)[10];
	p_array_t p1 = &num_array;
	for (int i = 0; i < 10; i++)
	{
		(*p1)[i] = i + 2; //先解引用,还原为一级指针(数组本身可以看为一级指针
						  //数组指针是指向数组的指针,也就是指向一级指针的指针,即二级指针)
	}
	PrintArray_int((*p1), 10);
	//指针数组
	const char* p2[2] = { "aaa", "bbb" };
	//p2[0] 和 p2[1] 都是一个指针
	printf("%s\n", p2[0]);
	printf("%s\n", p2[1]);
	system("pause");
	return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!   

相关文章

  • C语言实现电影管理系统

    C语言实现电影管理系统

    这篇文章主要为大家详细介绍了C语言实现电影管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言rand和srand函数使用方法介绍

    C语言rand和srand函数使用方法介绍

    rand()函数用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的。srand()用来设置rand()产生随机数时的随机数种子。参数seed是整数,通常可以利用time(0)或geypid(0)的返回值作为seed
    2023-02-02
  • C语言创建windows窗口实例

    C语言创建windows窗口实例

    这篇文章主要介绍了C语言创建windows窗口实例,本文直接给出实现代码,同时讲解了编码的步骤,需要的朋友可以参考下
    2015-04-04
  • c/c++输出重定向的方法

    c/c++输出重定向的方法

    c/c++输出重定向的方法,需要的朋友可以参考一下
    2013-03-03
  • C语言多媒体框架GStreamer入门和概述

    C语言多媒体框架GStreamer入门和概述

    这篇文章主要介绍了C语言多媒体开源框架GStreamer,本文总结了多媒体框架GStreamer一些基本概念及流程,希望能给使用GStreamer开源库的朋友提供一个借鉴或参考,需要的朋友可以参考下
    2022-07-07
  • Qt使用流处理XML文件的示例代码

    Qt使用流处理XML文件的示例代码

    XML(eXtensible Markup Language)是一种通用的文本格式,被广泛运用于数据交换和数据存储。本文主要来和大家聊聊如何使用 Qt 处理 XML 格式的文档,需要的可以参考一下
    2023-02-02
  • 使用单链表实现多项式计算示例

    使用单链表实现多项式计算示例

    这篇文章主要介绍了使用单链表实现多项式计算示例,需要的朋友可以参考下
    2014-03-03
  • C语言float内存布局示例详解

    C语言float内存布局示例详解

    这篇文章主要为大家介绍了C语言float内存布局示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • C++11智能指针中的 unique_ptr实例详解

    C++11智能指针中的 unique_ptr实例详解

    unique是独特的、唯一的意思,故名思议,unique_ptr可以“独占”地拥有它所指向的对象,它提供一种严格意义上的所有权。这篇文章主要介绍了C++11智能指针中的 unique_ptr实例详解,需要的朋友可以参考下
    2020-06-06
  • C/C++代码操作MySQL数据库详细步骤

    C/C++代码操作MySQL数据库详细步骤

    这篇文章主要给大家介绍了关于C/C++代码操作MySQL数据库的相关资料,通过文中的这些示例,我们可以连接到MySQL数据库,并执行常见的数据库操作,如创建表、插入数据和查询数据,需要的朋友可以参考下
    2023-12-12

最新评论