c语言指针

回调函数使用详解

最后都变了- 提交于 2019-12-12 13:04:44
转载自: https://blog.csdn.net/miao19920101/article/details/75648491 回调函数的使用 回调函数在C语言中是通过函数指针来实现的,通过将回调函数的地址传给被调函数从而实现回调。因此,要实现回调,必须首先定义函数指针。 1. 回调指针 概念:指针是一个变量,是用来指向内存地址的。一个程序运行时,所有和运行相关的物件都是需要加载到内存中,这就决定了程序运行时的任何物件都可以用指针来指向它。函数是存放在内存代码区域内的,它们同样有地址,因此同样可以用指针来存取函数,把这种指向函数入口地址的指针称为函数指针。 1. 采用函数调用的一般形式 首先看一个hello world!的程序: int application_start( void ) { OSStatus err = kNoErr; char *s ="hello world !"; app_log(" s:%s",s); return err; } 打印的结果是: [0][TCP: main.c: 90] s:hello world ! 如果采用函数调用的形式来实现: //声明 void Islog( char *s); int application_start( void ) { OSStatus err = kNoErr; Islog("hello world !")

C语言——初学指针

≡放荡痞女 提交于 2019-12-12 04:45:55
1. 指针的定义: 指针是一种数据类型,用来表示内存的地址。即表示内容地址的数据类型就是指针类型。 定义方式: 数据类型名* 指针变量名 eg:char* cp; int* p; ..... 由以下代码可直观了解指针的定义内容。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int main() { int a = 1024; int* p = &a; printf("%p\n", p); // 指针变量的内容 printf("%p\n", &a); // 变量a的地址 printf("%d\n", a); // 变量a 的值 printf("%d\n", *p); // 解引用指针 return 0; } 2. 指针的两个重要属性: (1)指针变量指向的内容地址; (2)指针指向内存地址上元素的数据类型,即每个元素所占内存的大小。 3. 一种的特殊的指针——空指针 void* 该指针只有地址,没有对应内存。有多种应用,如memset函数。 同时要避免也指针的使用。 4. 指针运算 (1) 指针加(减)整数 指针加(减)整数的结果是指针当前所指向的地址加(减)该整数*内存数据类型长度。 示例:以下代码可直观了解其运算方式 # include <stdio.h> int main() {

C++对象之内存(有继承)

我的梦境 提交于 2019-12-11 17:36:14
上一篇 介绍了C++对象在无继承的各种情况下的内存空间占用情况和内存布局,这一篇来讨论有继承时的情况。有继承的情况会复杂一些,本文会分为四个层次讨论:单一继承无多态、单一继承有多态、多重继承和虚拟继承。本文中的一些图片和一些观点来自《深入探索C++对象模型》,它C++对象的底层原理讲解得非常详细,强烈安利! 如无特别说明,以下代码均在64位机器上的VS2019运行 在C++继承模型中,子类是自己的成员与父类的成员的总和。但标准并没有规定子类和父类的排列顺序,大部分编译器将父类放在子类前面,但virtual base class除外,后面会讨论到。 单一继承无多态 一、空类 class Concrete1 { }; class Concrete2 : public Concrete1 { }; 输出sizeof(Concrete2)结果是1。原因和无继承时的空类大小为1的原因一样,空类的实例也需要有独一无二的内存地址,因此空类被赋予了1字节。 二、非空类 内存布局 在没有虚函数时,类的内存布局和C语言的struct完全一样。 代码测试 代码测试一下: class Point2d { protected: float _x, _y; }; class Point3d : public Point2d { protected: float _z; }; //main函数中: cout <

C中的函数指针如何工作?

倖福魔咒の 提交于 2019-12-11 11:28:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 我最近对C中的函数指针有一些经验。 因此,继续回答您自己的问题的传统,我决定为那些需要快速学习该主题的人做一些基本的总结。 #1楼 函数指针的另一个好用法: 轻松切换版本 当您在不同的时间或不同的开发阶段需要不同的功能时,它们非常方便使用。 例如,我正在具有控制台的主机上开发应用程序,但是该软件的最终版本将放在Avnet ZedBoard上(该端口具有用于显示和控制台的端口,但不需要/不需要它们用于)。最终版本)。 因此,在开发过程中,我将使用 printf 来查看状态和错误消息,但是当我完成后,我什么都不想打印了。 这是我所做的: 版本 // First, undefine all macros associated with version.h #undef DEBUG_VERSION #undef RELEASE_VERSION #undef INVALID_VERSION // Define which version we want to use #define DEBUG_VERSION // The current version // #define RELEASE_VERSION // To be uncommented when finished debugging #ifndef _

【C语言】移动指针

梦想与她 提交于 2019-12-11 08:15:30
移动指针 #include<stdio.h> int main() { char *s="哈哈哈哈哈哈"; for(*s;s!="\0";s++) printf("%c",*s); } 这个s首先会指向第一个字符“哈”然后通过循环会一次打印出一个字符,s++是地址移动,打印了一个字符后,就会移动到下一个字符! 来源: https://www.cnblogs.com/HGNET/p/12020200.html

C语言--结构体中的函数指针与函数

ⅰ亾dé卋堺 提交于 2019-12-10 13:28:31
1. 函数指针 一般的函数指针可以这么定义: int(*func)(int,int); 表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数: int add2(int x,int y) { return x+y; } 那么在实际使用指针func时可以这样实现: func=&add2; //指针赋值,或者func=add2; add2与&add2意义相同 printf("func(3,4)=%d\n",func(3,4)); typedef int(*FUN)(int,int); FUN func=&add2; func(); 其 实在 结构体中,也可以像一般变量一样,包含函数指针变量 .下面是一种简单的实现. #include "stdio.h" struct DEMO { int x,y; int (*func)(int,int); //函数指针 }; int add2(int x,int y) { return x+y; } void main() { struct DEMO demo; demo.func=&add2; //结构体函数指针赋值 printf("func(3,4)=%d\n",demo.func(3,4)); } 上面的文件保存为mytest.c,在VC6.0和gcc4中编译通过. 其实在结构体中

关于int整形变量占有字节问题 面试有用

爱⌒轻易说出口 提交于 2019-12-10 11:29:51
int的长度由处理器(16位,32位,64位)和比哪一期决定。 首先从处理器来讲 :16位处理器中的int 占有16位 即2个字节 32位处理器中int占有32位 即4个字节 64位处理器中int占有64位 即8个字节 附录: 数据类型特别是int相关的类型在不同位数机器的平台下长度不同。C99标准并不规定具体数据类型的长度大小,只规定级别。作下比较: 16位平台 char 1个字节8位 short 2个字节16位 int 2个字节16位 long 4个字节32位 指针 2个字节 32位平台 char 1个字节8位 short 2个字节16位 int 4个字节32位 long 4个字节 long long 8个字节 指针 4个字节 64位平台 char 1个字节 short 2个字节 int 4个字节 long 8个字节(区别) long long 8个字节 指针 8个字节(区别) 数据模型 (LP32 ILP32 LP64 LLP64 ILP64 ) 32位环境涉及"ILP32"数据模型,是因为C数据类型为32位的int、long、指针。而64位环境使用不同的数据模型,此时的long和指针已为64位,故称作"LP64"数据模型。 现今所有64位的类Unix平台均使用LP64数据模型,而64位Windows使用LLP64数据模型,除了指针是64位,其他基本类型都没有变。(注释

C语言常用指针小解

这一生的挚爱 提交于 2019-12-10 06:39:27
1:普通指针 char *ptr = “hello”; 2:二重指针 char **ptr = {“hello”,“my”,“love”}; 3:函数指针 故名诗意,指向函数的指针 void (*pfunc)(int argv); 使用 static void test_func(int cnt); pfunc = test_func; pfunc(1); 4:指针函数 返回值是指针类型的函数 char *pfunc(int argv); 5:指针数组 故名诗意:由指针所构成的数组 int parray[4]; []的优先级高于 ,所以parray是一个数组,数组里面存放的是int *的指针 6:数组指针 故名诗意:指向数组的指针 int (*ptr)[4]; ptr是一个指针,指向含有4个int变量的数组。 例如: int array[4] = {1,2,3,4}; int (*ptr)[4]; ptr = array; 来源: CSDN 作者: var.zhou 链接: https://blog.csdn.net/madannasf/article/details/103462602

复盘:广州某游戏公司后端校招笔试

我只是一个虾纸丫 提交于 2019-12-10 00:04:55
LN游戏笔试复盘 0. 写在前面 这次笔试应该算是我第一次正式的笔试。这次笔试复盘即使为了查漏补缺,也是为了纪念第一次笔试吧。试题是HR和我约好时间通过邮箱给我发送的,是一份word文档。首先要吐槽一下试卷的格式:竟然是用word文档的方式,现在大家不都是使用第三方公司或者自己研发的考试系统嘛= =。算了看一下题目:一共十道题,时间给了40分钟。其中C++基础概念题(简答题)3道,基础算法题7道。整体来说难度不大,但是题量十分巨大! 1. C++基础概念题 请解释封装、继承和多态。 封装:   封装就是将数据和行为相结合,抽象为一个整体,形成一个类。类中的数据和函数都是类的成员。我们可以使一部分成员充当类与外部的接口,而将其它的成员隐藏起来。这样就限制了外部对成员的访问,也使不同类之间的影响度降低。目的在于将对象的使用者和设计者分开,以提高软件的可维护性和可修改性。 继承:   继承就是新类从已有类那里得到已有的特性。类的派生指的是从已有类产生新类的过程。原有的类成为基类或父类,产生的新类称为派生类或子类。子类继承基类后,可以创建子类对象来调用基类函数,变量等。继承是代码重用的重要工具。 多态:   多态就是一个接口,多种实现。具体体现在调用同一个函数名,可以根据需要实现不同的功能。多态分为两种编译时多态和运行时多态。   静态多态(早绑定、编译时多态、重载)

Golang 中的指针 - Pointer

不想你离开。 提交于 2019-12-09 11:22:58
Golang 中的指针 - Pointer Go 的原生数据类型可以分为基本类型和高级类型,基本类型主要包含 string, bool, int 及 float 系列,高级类型包含 struct,array/slice,map,chan, func 。 相比 Java,Python,Javascript 等引用类型的语言,Golang 拥有类似C语言的指针这个相对古老的特性。但不同于 C 语言,Golang 的指针是单独的类型,而不是 C 语言中的 int 类型,而且也不能对指针做整数运算。从这一点看,Golang 的指针基本就是一种引用。 那么 Golang 为什么需要指针?这种指针又能有什么独特的用途呢? 在学习引用类型语言的时候,总是要先搞清楚,当给一个函数/方法传参的时候,传进去的是值还是引用。实际上,在大部分引用型语言里,参数为基本类型时,传进去的大都是值,也就是另外复制了一份参数到当前的函数调用栈。参数为高级类型时,传进去的基本都是引用。这个主要是因为虚拟机的内存管理导致的。 内存管理中的内存区域一般包括 heap 和 stack, stack 主要用来存储当前调用栈用到的简单类型数据:string,boolean,int,float 等。这些类型的内存占用小,容易回收,基本上它们的值和指针占用的空间差不多,因此可以直接复制,GC也比较容易做针对性的优化。