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

【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 值 | 函数 间接修改 指针变量 值 | 函数 间接修改 外部变量 原理 )

文章目录 一、直接修改 和 间接修改 指针变量 值 二、函数 间接修改 指针变量 值 三、函数 间接修改 外部变量 原理 一、直接修改 和 间接修改 指针变量 值 ---- 直接修改 指针变量...return 0; } 执行结果 : 二、函数 间接修改 指针变量 值 ---- 函数 间接修改 指针变量 值 , 将 指向一级指针 二级指针 变量 , 传递到 函数形参 ,... 函数 , 使用 * 符号 , 修改 二级指针 指向 一级指针 变量值 ; 注意 : 如果要 修改 一级指针 值 , 必须 传入 指向 一级指针 二级指针 变量 才可以 , 传入一级指针变量...n", p); // 函数 , 简介修改指针值 modify_pointer(p2); // 打印一级指针地址 printf("%d\n", p);...三、函数 间接修改 外部变量 原理 ---- 如果要 修改 一级指针 值 , 必须 传入 指向 一级指针 二级指针 变量 才可以 , 传入一级指针变量 , 不能修改一级指针变量值 ; 这是因为

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

objective-CClass(类类型),Selector(选择器SEL),函数指针(IMP)

今天园子里看到了一篇牛文“Objective-C 2.0 with Cocoa Foundation--- 5,Class类型,选择器Selector以及函数指针 ”,讲得十分精彩,忍不住把它代码加上注释整理于此...个人体会:obj-C“Class类型变量”比c#Object基类还要灵活,可以用它生成任何类型实例(但是它又不是NSObject)。...而选择器SEL与函数指针IMP,如果非要跟c#扯上关系的话,这二个结合起来,就点类似c#反射+委托,可以根据一个方法名称字符串,直接调用方法。...(传统C语言处理方式) void(*setSkinColor_Func)(id,SEL,NSString*); //定义一个IMP方式函数指针(obj-C推荐方式) IMP say_Func...say_Func = [cattle[1] methodForSelector:say]; //用函数指针形式调用setSkinColor setSkinColor_Func(cattle

1.8K51

【C++】继承 ⑥ ( 继承构造函数和析构函数 | 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父类 : 需要 基类 ( 父类 ) 对象..." 私有继承 " 派生类 , 是 不具有 基类 完整功能 , 因为 最终继承 后派生类 , 无法 类外部调用 父类 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...子类对象 , 父类指针 值为 子类对象 堆内存 地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针 ; 引用 : 父类引用 引用 子类对象 , 将 子类对象 赋值给 父类类型引用 ; 二...类型兼容性原则 : 父类指针 指向 子类对象 Parent* p_parent2 = NULL; p_parent2 = &child; 该原则应用场景如下 : 定义函数 , 接收 父类指针...(child); // 赋值兼容性原则 : cout << "\n赋值兼容性原则示例 : \n" << endl; // 常规操作 : 父类指针 指向 父类对象

23120

指向函数指针

指向函数指针 程序定义函数后,对程序进行编译时,编译系统为函数分配一段存储空间存储二进制代码,这段内存空间起始地址(也称入口地址)称为函数指针。...程序可以定义一个指针变量,用来存放一个函数起始地址,即该指针变量指向一个函数,称为函数指针变量。...实际上函数指针变量定义时,形参名字对编译没有意义,习惯上省略写。...一般形式如下: 函数指针变量=函数名; 注意,赋值符右边只写函数名,不需要定参数表。如果写上参数会出现编译错误。...(3)通过函数指针变量调用函数一般形式如下: (*函数指针变量)(实参列表); 通过函数指针变量调用函数效果与使用函数名调用函数执行流程是一样,实参与形参同样要求个数相同,类型符合赋值兼容规则

78410

【C++】继承 ⑥ ( 类型兼容性原则 | 父类指针 指向 子类对象 | 使用 子类对象 为 父类对象 进行初始化 )

一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父类 : 需要 基类 ( 父类 ) 对象..." 私有继承 " 派生类 , 是 不具有 基类 完整功能 , 因为 最终继承 后派生类 , 无法 类外部调用 父类 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...子类对象 , 父类指针 值为 子类对象 堆内存 地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针 ; 引用 : 父类引用 引用 子类对象 , 将 子类对象 赋值给 父类类型引用 ; 二...类型兼容性原则 : 父类指针 指向 子类对象 Parent* p_parent2 = NULL; p_parent2 = &child; 该原则应用场景如下 : 定义函数 , 接收 父类指针...(child); // 赋值兼容性原则 : cout << "\n赋值兼容性原则示例 : \n" << endl; // 常规操作 : 父类指针 指向 父类对象

13400

为什么告警warning implicit declaration of function必须修复

mallocstdlib.h声明,没有include为什么编译器没有报错。C Standard还没发布时候,是允许声明、不定义就使用函数。为了适配这些老代码编译器是比较宽松。...编译器会从提供参数类型推断出函数prototype(定义)。在上面例子,malloc被推断为:int malloc(int, size_t),这是非常危险!...因为函数指针从int64被截断为int32,而你没收到任何错误提示(只有告警),只有在运行时才会踩坑(发现指针截断了)。...运行时也不一定总会报错,因为如果截断后,指针地址低地址,32位int能装下,程序是没有任何问题。...但是一旦函数返回地址高地址,截断后int32指向就会有问题,运气好是个非法地址会core,运气不好直接拿到一个能写地址,就把别的内存踩坏了,非常难查,因为报错位置逻辑本身应该没有任何问题,内存是被隔空踩坏了

1.3K40

C++类型转换

explicit 三、常见面试题 零、前言 本章主要学习C++四种类型转换 一、C语言类型转换 概念及介绍: C语言中,如赋值运算符左右两侧类型不同,或者形参与实参类型匹配,或者返回值类型与接收返回值类型不一致时...显式类型转换将所有情况混合在一起,代码不够清晰 因此C++提出了自己类型转化风格,注意因为C++要兼容C语言,所以C++还可以使用C语言转化风格 二、C++强制类型转换 标准C...// 所以非常BUG,下面转换函数指针代码是不可移植,所以建议这样用 // C++不保证所有的函数指针都被一样使用,所以这样用有时会产生不确定结果 // FUNC.../引用转换为子类对象指针或引用(动态转换) 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则) 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全...基类必须要有虚函数 对于下行转换,dynamic_cast是安全(当类型不一致时,转换过来是空指针),而static_cast是不安全(当类型不一致时,转换过来错误意义指针,可能造成踩内存

1.9K20

Effective C++: 改善程序与设计55个具体做法

条款09:绝不在构造和析构过程调用virtual函数 请记住 ■ 构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数那层)。...条款11:operator=处理“自我赋值” 请记住 ■ 确保当对象自我赋值时operator=有良好行为。...如果你new表达式不使用[],一定不要在相应delete表达式中使用[]。 条款17:以独立语句将newed对象置入智能指针 请记住 ■ 以独立语句将 newed对象存储于(置入)智能指针内。...条款25:考虑写出一个抛异常swap函数 请记住 ■ 当std::swap对你类型效率不高时,提供一个swap成员函数,并确定这个函数抛出异常。...条款45:运用成员函数模板接受所有兼容类型 请记住 ■ 请使用member function templates(成员函数模板)生成“可接受所有兼容类型函数

66020

详解指针(超详细)(第一卷)

提到变量我们首先就要考虑这个变量占多少字节 当然这里我就用了int char两个类型,我们不难发现在debug状态下x64任意指针变量字节都是8,x86任意指针类型字节都为4。...贴上一个错误代码示例 编译器会给出类型兼容警告,所以指针变量类型和你要访问变量类型要保持一致。...当然所有的指针变量中有一个极为特殊,void*可以接受所有变量类型地址并不会触发类型兼容警告,但它缺陷就是不能进行解引用操作和接下来要讲指针运算。...越界访问指针指针指向超出分配内存范围地址。 4. 空指针解引用:对一个空指针进行解引用操作。 5. 指针运算错误指针运算过程中出现错误,导致指针指向错误地址。...使用错误处理机制:程序添加错误处理机制,捕获和处理可能出现指针错误

7210

【编程基础】C语言指针初始化和赋值

因为,C语言里面,没有整体处理一个字符串机制 赋值: cp = "abcdefg"; *cp=”abcdefg” ;//错误!...对于这个赋值问题还可以换一个角度去理解,C语言中,使用赋值操作符时,赋值操作符左边和右边表达式类型应该是相同,如果不是,赋值操作符将试图把右边表达式值转换为左边类型。...也就是说,我们可以将0、0L、'/0'、2–2、0*5以及(void *)0赋给一个任何类型指针,此后这个指针就成为一个空指针,由系统保证空指针指向任何对象或函数。...,如:char *cp = “abcdefg”; 对指针进行初始化或赋值实质是将一个地址或同类型(或相兼容类型)指针赋给它,而不管这个地址是怎么取得。...C语言中malloc函数返回值就是一个void *型指针,我们可以把它直接赋给一个其他类型指针,但从安全编程风格角度以及兼容性上讲,最好还是将返回指针强制转换为所需类型,另外,malloc无法满足请求时会通过返回一个空指针来作为

2.6K80

C语言指针初始化和赋值

因为,C语言里面,没有整体处理一个字符串机制 赋值: cp = “abcdefg”; *cp=”abcdefg” ;//错误!...对于这个赋值问题还可以换一个角度去理解,C语言中,使用赋值操作符时,赋值操作符左边和右边表达式类型应该是相同,如果不是,赋值操作符将试图把右边表达式值转换为左边类型。...也就是说,我们可以将0、0L、’/0’、2–2、0*5以及(void *)0赋给一个任何类型指针,此后这个指针就成为一个空指针,由系统保证空指针指向任何对象或函数。...,如:char *cp = “abcdefg”; 对指针进行初始化或赋值实质是将一个地址或同类型(或相兼容类型)指针赋给它,而不管这个地址是怎么取得。...C语言中malloc函数返回值就是一个void *型指针,我们可以把它直接赋给一个其他类型指针,但从安全编程风格角度以及兼容性上讲,最好还是将返回指针强制转换为所需类型,另外,malloc无法满足请求时会通过返回一个空指针来作为

2.3K10

C语言 | 每日基础(40)

读者:有个函数, 本该返回一个字符串, 但当它返回调用者时候, 返回 串却是垃圾信息。 阿一:确保指向内存已经正确分配了。...*/ } 一种解决方案是把返回缓冲区声明为 static char retbuf[20]; 本方案并非完美, 尤其是有问题函数可能会递归调用, 或者会同时使用到它 多个返回值时。...读者:为什么有些代码小心地把 malloc 返回值转换为分配指针类型?...阿一: ANSI/ISO 标准 C 引入 void * 一般指针类型之前, 这种类型转换通常用于 兼容指针类型赋值时消除警告。... ANSI/ISO 标准 C 下, 这些转换不再需要, 而起事实上现代实践也鼓励 这样做, 因为它们可能掩盖 malloc() 声明错误时产生重要警告。

5323329

【C++航海王:追寻罗杰编程之路】C++类型转换

1 -> C语言中类型转换 C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转换,C语言中总共有两种形式类型转换: 隐式类型转换...因此C++提出了自己类型转换风格,注意:因为C++要兼容C语言,所以C++还可以使用C语言转换风格。.../引用转换为子类对象指针/引用(动态转换) 向上转型:子类对象指针/引用 -> 父类指针/引用(不需要转换,赋值兼容规则)。...向下转型:父类对象指针/引用 -> 子类指针/引用(用dynamic_cast转型是安全)。 注意: dynamic_cast只能用于父类含有虚函数类。...,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同方法达到同一目的,如果非强制类型转换不可,则应限制强制类型转换值作用域,以减少发生错误机会。

10010

《Effective C++》读书摘要

七、多态基类声明虚析构函数)具有多态性质基类()需要虚析构函数; 八、不让异常逃出析构 异常时终止或者吞下; 将可能抛出异常代码提供给用户管理; 九、不在构造和析构调用虚函数 调用后仅仅是自身函数...二十三、用非成员函数和非友元函数替换成员函数 封装强度和改变强度成反比,因为只影响有限用户; 类外访问函数封装性好于累内成员函数封装性,增加累内私有数据访问函数数量; 二十四、参数需要类型转换应使用非成员函数...三十五、考虑虚函数以外选择 私有虚函数父类被调用时候自动多态,基本保留何时调用权力,子类拥有修改功能权力; ? function函数指针对象使得函数指针更加灵活; 古典策略模式: ?...四十二、typename双重含义 模板声明与class没有任何区别; 嵌套从属类型显式指定,不能出现在基类列表和初始化列表; ?...四十五、运用成员函数模板接受兼容类型 成员函数使用函数模板兼容更多类型函数模板声明后copy构造和编译器生成并不同,需要单独处理。

1.9K60

【c++】类型转换

C语言类型转换 C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式类型转换:隐式类型转换和显式类型转换...显式类型转换将所有情况混合在一起,代码不够清晰 因此C++提出了自己类型转化风格,注意因为C++要兼容C语言,所以C++还可以使用C语言转化风格。...—》父类指针/引用(不需要转换,赋值兼容规则) 向下转型:父类对象指针/引用——》子类指针/引用(用dynamic_cast转型是安全) 注意: 1.dynamic_cast只能用于父类含有虚函数类...return 0; } A a2 = 11等价于先构造A tmp(11);拷贝A a2(tmp); 早期编译器,遇到A a2=11会先构造临时对象,在用临时对象拷贝构造a2;但是现在编译器做了优化...decltype:在运行时推演出一个表达式或函数返回值类型。 dynamic_cast:在运行时识别出一个父类指针(或引用)指向是父类对象还是子类对象。

19220

呜呜呜我要拿Go赢他~ 入门,基础语法Type 、interface、struct、*指针接收器

前言 继续接入上章节05-呜呜呜我要拿Go赢他~ 入门,Http库、基础语法type 文章现在要学是基础语法type Go 语言中,type 定义用于声明自定义类型。...自定义类型可以是基本类型扩展,也可以是复合类型,如结构体、接口和函数等 Type 定义 • type 名字 interface {} • type 名字 struct {} 相当于就是实体类 • type...,只能使用指针 • 准确来说,整个引用链上,如果构成循环,那就只能用指针 必须使用指针 方法接收器 结构体接收器内部永远不要修改字段 Go语言中,结构体接收器内部永远不要修改字段,主要是为了遵循良好编程实践和保持代码可读性与可维护性...其中 type A=B 这种别名,一般只用于兼容性处理 • 先有抽象再有实现,所以要先定义接口 • 鸭子类型:一个结构体有某个接口所有方法,它就实现了这个接口 • 指针:方法接收器,遇事决用指针 最后...本期结束咱们下次再见~ 关注我迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎评论区留言,我一般看到都会回复

22321

VBA: 隐藏模块中出现编译错误解决对策

当代码与此应用程序版本或体系结构兼容(例如文档代码面向 32 位 Microsoft Office 应用程序,但它试图 64 位 Office 上运行)时,通常会发生此错误。...因为 VBA 版本 6 和更早版本没有用于指针或句柄特定数据类型,所以,它使用 Long 数据类型(一种 32 位 4 字节数据类型)来引用指针和句柄。...64 位环境指针和句柄为 8 字节 64 位数。这些 64 位数不能包含在 32 位数据类型。...同时,还需要找到并修改这些 Declare 语句内所有引用句柄或指针数据类型以使用新 64 位兼容 LongPtr 类型别名,并且需要使用新 LongLong 数据类型保存 64 位整数类型。...此外,还必须更新任何包含指针或句柄以及 64 位整数用户定义类型 (UDT),使之使用 64 位数据类型,同时,必须验证所有变量赋值是否正确,以防止发生类型匹配错误

11.2K10
领券