首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【进阶指针二】数组传参&指针传参&函数指针&函数指针数组&回调函数

【进阶指针一】字符指针&指针数组&数组指针 https://blog.csdn.net/qq_64428099/article/details/125011487 目录  1.数组传参 1-2 二维数组传参...  2 指针传参 2-1 一级指针传参 2-2 二级指针传参 2-3 关于传&arr和arr 3 函数指针 3-1 函数指针的引入 3-2 函数指针的脱裤子放屁使用【先见一见基本操作】 3-3 试图看懂大佬写的代码... 4 函数指针数组 4-1函数指针数组的引入和基本使用  4-2 函数指针数组的妙用 ----  1.数组传参 1-1一维数组传参 正向:实参给定,猜猜看形参可以怎么写?...2 指针传参 反向:形参给定,猜猜看实参可以怎么写?...(因为你传整个数组的地址,你又不能一次性打印出来,你还得对整个数组的地址进行解引用。

89540

指针详解(二级指针、指针数组和数组指针、字符指针、二维数组传参、函数指针变量)(二)

:当你在写函数时,如果你想让函数操作一个数组,你可以将数组的指针作为函数的参数传递。...四、二维数组传参,形参写二维数组 1、为什么一维数组传参,形参可以是数组,也可以是指针?...1.写成数组更加直观,为了方便理解 2.写成指针传参是因为数组传参,传递的是数组的第一个元素的地址 二维数组传参,形参写成数组也是可以的,非常直观,容易理解 2、形参能写成指针吗?...:在很多情况下,我们需要将一个函数作为参数传递给另一个函数。...在这些情况下,我们可以将函数指针作为参数传递,以便在需要时调用这个函数。 2、函数指针数组:我们可以创建一个包含函数指针的数组,这样就可以用一个统一的接口来调用多种不同的函数。

54910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    指针详解(const、指针运算、数组名的理解、传址调用和传值调用、一维数组的本质​)(一)

    1.首先,arr被解析为指向数组首元素的指针。在内存中,数组的元素是连续存储的,而数组名实际上是一个指向数组首元素的指针。因此,通过arr可以找到数组的起始位置。...3.arr[i]中的[]是索引运算符,用于访问数组中的元素。它表示将数组名arr解析为指向数组首元素的指针,并使用索引i进行偏移,以访问数组中第i个元素的值。...数组传参的时候形参是不会创建数组的,实际上传的是首元素的地址,发生了数组降级 void test(int arr[]) //int *arr { int sz = sizeof(arr) / sizeof...//test(arr);//这里的数组名就是数组首元素地址 Print(arr,sz); return 0; } 六、传址调用和传值调用 传值调用:传的是变量,传值调用 int Add...//数组名是数组首元素的地址 printf("%zd\n", len); return 0; } 6.2为什么有传址和传值两种调用方式 因为有一些问题是不使用指针无法解决的!!!

    19610

    深入探索C语言中的结构体:定义、特性与应用

    name是一个字符型数组,有20个元素;age是一个整型变量;height是一个浮点型变量。...结构体中可以包含基本数据类型、枚举类型、数组、指针等。 指针类型:表示变量的地址。 数组类型:表示一组相同类型的变量。 函数类型:表示函数的参数和返回值类型。...}; printf("%s,%d", s.name, s.age);//使用.访问s中的成员 结构体指针访问指向变量的成员: struct Stu //类型声明 { char name[...->name, ps->age);//使用->访问ps指向的结构体成员 结构体传参 结构体传参可以通过以下两种方式: 传值传参 将结构体的副本传递给函数。...); 传地址传参 将结构体的指针传递给函数,以便在函数内部修改结构体的内容。

    24610

    【C 语言】二级指针作为输入 ( 指针数组 | 将 二级指针 作为函数输入 | 抽象函数业务逻辑 )

    文章目录 一、打印 指针数组 中指针指向的字符串 二、字符串排序 三、代码示例 一、打印 指针数组 中指针指向的字符串 ---- 打印 指针数组 中指针指向的字符串 : 指针退化问题 : 传入二级指针..., 同时还要传入 一级指针的个数 ; 实参是 指针数组 , 形参 退化为 二级指针 , 需要人为指定 数组的元素个数 ; 验证指针合法性 : 函数中 , 只要是指针 , 就有可能为 NULL , 函数入口就要验证该指针合法性...[i]); printf("%s\n", *(array + i)); } return 0; } 二、字符串排序 ---- 将 指针数组 作为参数 , 传入函数中 ;...发现是 char , 说明指针指向的数据是 char 类型 * * array 是一个数组 , 数组中的元素的 char * 字符串 * * 这是 指针数组 ,...) / sizeof(array[0]); // 打印数组 printf_array(array, num); // 对 指针数组 进行排序 , 排序依据是 指针 指向的数据对比

    60410

    结构体作为函数的参数

    1.传递结构体成员 > 只要结构体成员是一个具有单个值的数据类型,便可把它作为参数传递给接受该特定类型的函数。 > 使用这种方式为函数传递参数与普通变量作为参数相同,都是以传值的方式传递的。...2.传递结构体 > 使用结构体变量作为函数的参数时,也是传值的,会将结构体变量的全部内存单元的内容拷贝一份传递给被调函数。被调函数的形参也必须是同类型的结构体类型。...(struct book stdata); modify(Shot); 3.传递结构体地址 > 在传值的过程中,程序的空间和时间开销比较大,且传递的是一份拷贝,并不能改变实参本身的值。...为了解决以上问题,使用结构体指针是一个更好的办法。 > 需要注意的是,结构体变量名与数组变量名不同,结构体变量名不是它的地址。...> 实参还有第二种写法,将实参直接定义为结构体指针 struct book { float price; int page; char title[50]; char

    2.1K10

    深度刨析程序中的指针

    int (*parr3[10])[5];//数组指针数组 4.数组传参、指针参数 在写代码时不可避免的要把【数组】或者【指针】传递给函数,那么函数的参数设计要怎么做呢?...4.1 一维数组传参 #include void test(int arr[])//可行,最容易理解的写法([]内的数字可以随便写,不影响系统的判断)该传参的本质就是int* arr...*/ 简化代码2 typedef void (*pf)(int); pf signal (int,pf);//利用typedef将类型重命名,来简化代码 6.函数指针数组 数组是存放相同类型数据的存储空间...int (*pf)();//这是一个函数指针 //我们将[]添加到变量名后面就可以了 int (*pf[10])();//这就是函数指针数组 pf先[]结合说明pf是一个数组,然后数组存放的类型就是int...(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数,我们就说这是回调函数。

    7110

    指针:这块地方是我的了!

    整点高级的: 函数参数可以是指针,指针参数可以指向任何类型的变量(包括基本数据类型、结构体、数组、函数等)。 使用指针作为函数参数允许函数直接操作传递给它的变量,而无需返回任何值。 好理解吧?...当函数参数是指向基本数据类型的指针时,函数可以修改传递给它的变量的值。这通常用于模拟“传值传引用”的机制,即通过指针将数据传递给函数,从而使函数能够直接修改原始数据。...#include struct Person { char name[50]; int age; }; void updateAge(struct Person*...} printf("\n"); return 0; } 在C语言中,数组名本身就是指向数组首元素的指针,因此可以将数组的指针作为函数参数传递。...p = arr 将指针 p 指向了数组 arr 的第一个元素 arr[0] 的地址。 指针存储的是变量或数组等数据结构的内存地址。 内存地址表示变量或数组的起始位置。

    6710

    【C++初阶】类和对象修炼上

    这一专题是C++学习者的第一道小坎,我将分为上中下三节给大家讲解 类和对象上:类和对象的引入,包括一些细碎的知识点,包括面向对象思想,类的实例化,this指针等 类和对象中:类和对象中的六大默认成员函数中最常用的...默认访问限定符修饰:class为了体现封装性,约束访问成员变量,将默认访问限定符修饰为私有;而struct默认使用者编程素质较高,自由访问成员变量,将默认访问限定符修饰为共有。...,其实都可以只调用一个函数ArrayPrint(),只需要传入各自的数组名和数组元素个数即可打印出各自的数组(只不过在C++中这里的参数变成了隐含的this指针,后面第9点会讲) 8.类/对象的大小...只能在“成员函数”的内部使用 this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针。...this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传递 其实:我们细想一下,我们在学C语言的时候,对于传参,我们一般都是选择传一个变量(比如栈或数组

    69640

    【C 语言】二级指针内存模型 ( 指针数组 | 二维数组 | 自定义二级指针 | 将 一、二 模型数据拷贝到 三 模型中 并 排序 )

    自定义二级指针 中 ---- 将 指针数组 和 二维数组 中的数据 拷贝到 自定义二级指针 内存模型中 , 并进行排序 ; 1、函数形参 设计规则 函数形参 设计规则 : 向 函数中 传入 二级指针...char **p3 = NULL; 退化为 : // 二维指针 char **p3 代码示例 : /** * @brief copy_data 将 指针数组 和 二维数组 中的数据拷贝到...array 大小 */ #define LENGTH(array) (sizeof(array)/sizeof(*array)) /** * @brief copy_data 将 指针数组 和 二维数组...ret = -1; return ret; } // 遍历将 p1 指针数组 中的数据 拷贝到 二级指针 中 for (i = 0; i < count1; i...char **p3 = NULL; // 存储 p3 指向的一级指针个数 int len3 = 0; // 将 指针数组 二维数组 数据 拷贝到 二级指针 中

    63220

    C++|Compiler|活动记录(栈帧)

    (隐式链表) 类似于对象第一个参数隐式传this指针,因此类的方法能够访问类的field,但是这个原理又大相径庭,这个其实是建立了一个栈帧链表。...如果儿子1调用儿子2,那么事实上儿子1是通过父亲访问到的儿子2,因此不能直接传儿子1的栈帧,而是先回溯到父亲的栈帧,再把父亲的栈帧指针作为第一个参数传递给儿子2....嵌套层次显示表(Display) 嵌套层次显示表是帧指针组成的数组,下标为深度。...入口出口由于callee-save需要的指令更多,但是由于采用数组而不是链表,在随机访问上则更占据优势。...提升(Lambda Lifting) 将父函数中每一个被子函数(或者孙子、曾孙...)访问的变量作为额外的参数按引用传递给子函数。

    1.2K40

    C语言进阶——指针

    、指针参数 1.一维数组传参 数组传参,形参是可以写成数组形式的...数组传参的木质是,传递了数组首元素的地址 数组传参,形参也可以是指针!...如果你把函数的指针(地址)作为参数传递给另一 个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。...D.回调函数是调用函数指针指向函数的函数。 解析: 回调函数是一种在编程中常见的概念,它是指将一个函数作为参数传递给另一个函数,并在特定的条件或事件发生时被调用执行的函数。...具体来说,回调函数是作为参数传递给其他函数的函数指针或函数对象。当满足特定条件或事件发生时,调用该函数指针或函数对象,以执行预定义的操作或逻辑。

    12510

    C语言:指针4(超级详细讲解qsort函数使用)

    回调函数 如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数 回调函数在指针3的转移表我们就用到了回调函数 回调函数是就一个函数 下面在代码我们可以看到...个参数(指向数组第1个元素的指针(首元素),元素个数值,元素类型大小,比较函数) 比较函数的参数为什么使用void*类型呢,因为void*可以接收全部参数,,但是比较数值必须要强制类型转换。...xs*)x)->xm,((struct xs *)y)->xm); //} int add(const void* x, const void* y) { //按年龄来排序 return ((struct...xs*)x)->nl - ((struct xs*)y)->nl; } int main() { struct xs arr[3] = { {"zhangsan",15} ,{"lisi",25...,这数组是int指针类型的我们就需要循环4次 //比较函数 int fh(const void*x,const void*y) { //强制类型转换成char*然后解引⽤ return (*(char

    11610

    【C语言】回调函数

    一、回调函数的定义 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个 函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。...二、qsort函数的实现 qsort函数是一个快排函数; qsort函数需要传的参数分别是:首元素地址,元素的个数,每个元素的大小(字节为单位),一个比较函数(需要自己实现); 排列数组:...Student //将struct Student类型起别名为S { char name[20]; int age; }S; int compare(void...} 在以上两种类型排序中,compare函数都是回调函数; 三、利用冒泡排序的思想模拟实现qsort()函数 这个bubble_sort函数可以排序任意类型的数据 两个核心函数: 交换函数,这里传参传的分别是两个元素的地址和每个元素的类型大小...tmp = *p1; *p1 = *p2; *p2 = tmp; p1++; p2++; } } (1)这里使用void*指针接收,因为不知道使用者会传什么类型的指针过来

    19510

    初识C语言·指针(4)

    1 回调函数 回调函数是通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被用来调用其所指向的函数 时,被调用的函数就是回调函数。...在上一篇中模拟实现加减乘除的计算器中,我们使用了函数指针数组,也就是转移表,这种方法也较为快捷,但是实际上,回调函数也是非常快捷的。...main函数的基本框架写好之后,我们调用Fun函数,传的是函数名,因为函数名就是地址,所以你传函数名可以,&函数名也可以,毕竟都是地址,传过去之后用函数指针接收,注意函数指针的基本格式不能错。...第一个 void* base,理解为传一个你要开始排序的起始位置的指针,比如我对数组arr进行排序,我们就传arr进去,因为数组名就是首元素地址,所以不需要&符号,当然,你要是想要从第二个元素开始排序,...,那么我们肯定传的参数是数组元素的地址,因为是整型,所以我们先把指针强制转换为int类型的指针,而且函数的形参是void*,所以更需要强制转化了,转化之后就是解引用操作了,最后通过两个数相减,如果p1

    5910

    C语言初阶——结构体

    ️前言   无论是整型、实型还是我们的数组,它们都只能描述单一对象,无法对一个复杂对象进行描述,比如我们的学生信息,包含学生姓名(字符型数组)、学号(整型)、电话号码(整型数组)等,将需要的信息整合在一起...,也就是将声明与成员变量结合在一起 结构体初始化本质上是将类型匹配的数据存入结构体变量中 //结构体定义 struct stu { char name[10];//姓名 int ID;...总不能像数组一样利用下标吧。当然不是,结构体有自己的操作符---成员访问操作符 .  以及指针版的 -> ,都能很好的访问到结构体成员。 结构体变量版 这里我们先使用成员访问操作符 ....\n", a.name, a.ID, a.price); return 0; } 结构体指针版  指针是万能的,我们的结构体也有属于自己的指针,称为结构体指针 //结构体访问 struct book...语言","09212345678",9.9f};//存入数据 struct book* pa = &a;//结构体指针指向结构体变量a print1(a);//传值 print2(&a);//传址

    11420

    C语言中的结构体:从定义到传递

    操作成员如果是结构体指针变量,通过 -> 操作成功#include #include // 结构体类型的定义struct stu { char name[50...传值是指将参数的值拷贝一份传递给函数,函数内部对该参数的修改不会影响到原来的变量示例代码:#include #include // 结构体类型的定义struct...printf("函数外部:%s, %d\n", s.name, (&s)->age); return 0;}运行结果:函数内部:yoyo, 20函数外部:mike, 18结构体地址传递传址是指将参数的地址传递给函数...编写程序,创建一个Person类型的结构体数组,包含3个人的信息,并输出每个人的姓名和年龄。...int age;};struct Person person[3] = { // person[3]是结构体数组 {"喜羊羊", 22}, // 结构元素 {"懒羊羊

    40920
    领券