当前位置: 首页 > news >正文

C语言指针用法详解

目录

一、指针数组(Array of Pointers)

二、数组指针(Pointer of Array)

三、函数指针(Pointer to Function)

四、指针函数(Function Returning Pointer)

五、函数指针数组(Array of Function Pointers)

六、指针函数数组(Array of Functions Returning Pointers)

七、记忆技巧


一、指针数组(Array of Pointers)

是一个数组,其元素都是指针。

形式:类型 *名字数组名[大小]

本质:数组元素都是指针

int *ptr_arr[5]; // 包含5个int指针的数组
int a = 1, b =2, c = 3;
int *ptr_arry[3] = {&a, &b, &c}; // 指针数组for(int i = 0; i < 3 ; i++)
{printf("", *ptr_arr[i]); // 输出:1 2 3
}

二、数组指针(Pointer of Array)

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

形式:类型 (*指针名)[大小]

本质:指向整个数组的指针

int (*arr_ptr)[5]; // 指向包含5个int的数组的指针
int arr[3] = {10, 20, 30};
int (*arr_ptr)[3] =  &arr; // 数组指针printf("%d\n", (*arr_ptr)[1]); // 输出: 20

int (*arr_ptr)[3] =  &arr; // 数组指针   为什么要写成&arr ?

在C语言中,数组名在大多数情况下会“退化”成指向数组首元素的指针。例如:

int arr[3] = {10 , 20, 30};
int *ptr = arr;pritf("%d\n", *ptr); // 输出arr[0]的值为10

这里的arr会“退化”成指向arr[0]的指针,所以ptr是一个指向int类型的指针,它指向数组arr的第一个元素。

&arr所取的是整个数组的地址,其类型为int (*)[3],也就是指向包含3个int类型元素的数组的指针。

三、函数指针(Pointer to Function)

函数指针是指向函数的指针。

形式:返回类型 (*指针名)(参数列表)

本质:指向函数的指针。

int (*func_ptr)(int, int); // 指向返回int、接受两个int参数的函数
int add(int a, int b) { return a + b;}
int (*func_ptr)(int, int) = add; // 函数指针printf("%d\n", func_ptr(3, 5)); // 输出:8

四、指针函数(Function Returning Pointer)

指针函数是返回指针的函数。

形式:返回类型 *函数名(参数列表)

本质:返回指针的函数

int *get_ptr(int x); // 返回int指针的函数
int *get_address(int *p) { //指针函数return p;
}int num = 42;
int *p = get_address(&num);
printf("%d\n", *p); // 输出:42

五、函数指针数组(Array of Function Pointers)

是一个数组,其元素都是指向函数的指针。

形式:返回类型 (*数组名[大小])(参数列表)

本质:数组元素都是函数指针

int (*func_arr[3])(int); // 包含3个函数指针的数组,每个指针指向返回int,接受一个int参数的函数
#include <stdio.h>//定义几个函数
int add(int a, int b){ return a + b; }
int sub(int a, int b){ return a - b; }
int mul(int a, int b){ return a * b; }int main(void){//声明并初始化函数指针数组int (*func_ptr_arr[3])(int, int) = {add, sub, mul};//使用函数指针数组for(int i = 0; i < 3; i++){printf("Result: %d\n", func_ptr_arr[i](10,5));}/* 输出Result: 15Result: 5Result: 50*/return 0;
}

六、指针函数数组(Array of Functions Returning Pointers)

       指针函数数组是一个数组,其元素都是返回指针的函数。这两种用法在实际中较为少见,因为通常函数指针数组更为常用。

形式:返回类型 *(*数组名[大小])(参数列表)

本质:数组元素都是返回指针的函数(罕见用法)

int *(*ptr_func_arr[2])(int); // 包含2个函数的数组,每个函数返回int指针、接受一个int参数
#include <stdio.h>
#include <stdlib.h>//定义几个返回指针的函数
int *create_int(int value){int *p = malloc(sizeof(int));*p = value;return p;
}float *create_float(float value){float *p = malloc(sizeof(float));*p = value;return p;
}int main(void)
{//声明指针函数的数组(不常见用法)void *(*func_arr[2])() = {(void *(*)())create_int,(void *(*)())create_float};// 使用指针函数数组int *int_ptr = ((int *(*)())func_arr[0])(42);float *float_ptr = ((float *(*)())func_arr[1])(3.14f);printf("int: %d, float: %.2f\n", *int_ptr, *float_ptr);free(int_ptr);free(float_ptr);return 0 ;
}

七、记忆技巧

类型关键特征形式规律
指针数组先有数组,元素是指针类型 *名字[]
数组指针先有指针,指向数组类型 (*名字)[]
函数指针先有指针,指向函数返回类型 (*名字)(参数)
指针函数先有函数,返回指针返回类型 *名字(参数)
函数指针数组先有数组,元素是函数指针返回类型 (*名字[])(参数)
指针函数数组先有数组,元素是返回指针的函数返回类型 *(*名字[])(参数)

函数指针数组和指针函数数组关键区别:

  • 函数指针数组:数组元素是指向函数的指针
  • 指针函数数组:数组元素是返回指针的函数

相关文章:

  • openstack虚拟机状态异常处理
  • 数据结构、刷leetcode返航版--二分【有序】5/7
  • AI开发playwright tool提示词
  • 读《暗时间》有感
  • 【C++】类和对象【下】
  • Linux 驱动开发步骤及 SPI 设备驱动移植示例
  • chili调试笔记13 工程图模块 mesh渲染 mesh共享边显示实现
  • 藏文智能输入入门实践-简单拼写纠错
  • 【Agent】使用 Python 结合 OpenAI 的 API 实现一个支持 Function Call 的程序,修改本机的 txt 文件
  • 光伏“531”政策倒逼下,光储充一体化系统如何破解分布式光伏收益困局?
  • VMware更改语言设置
  • 使用Go语言对接全球股票数据源API实践指南
  • 【C++进阶】第1课—继承
  • 【软件设计师:数据结构】1.数据结构基础(一)
  • 【Bootstrap V4系列】学习入门教程之 组件-轮播(Carousel)高级用法
  • linux基础学习--linux磁盘与文件管理系统
  • OC的实例对象,类对象,元类对象
  • 外包团队协作效率低,如何优化
  • python打卡day18
  • 【一篇详解】深入浅出RabbtiMQ消息队列
  • 晶圆销量上升,中芯国际一季度营收增长近三成,净利增超1.6倍
  • 上海:下调个人住房公积金贷款利率
  • 48岁黄世芳履新中国驻毛里求斯大使,曾在广西工作多年
  • 贵州黔西游船倾覆事故70名落水人员在院救治,均为轻伤
  • “特朗普效应”下澳大利亚执政工党赢得大选,年轻选民担忧房价
  • 安徽安庆市委书记张祥安调研假日经济和旅游安全工作