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

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

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

20.8K10

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语言边角料:结构体中指针类型成员变量,它类型重要吗?

本着强迫症要消灭一切警告做法,最终定位到:是结构体内部, 指向结构体类型指针成员变量导致问题。 这个问题,也许永远不会碰到,之所以被我赶上了,应该是因为某个时候手贱, 误碰了键盘导致。...然后 gcc 在解析 Data2 d2 = {2, &d1}; 这一行时,就发现 类型匹配了:data2 next 需要是 struct _Data3_ 类型指针,但是赋值 d1 是 struct..._Data1_ 类型,于是给出警告信息。...三、把类型改为 void 指针类型 把 struct _Data2_ next 成员,改为 指向 void 型指针,然后在 main 函数操作它。...然后把这个地址赋值给dn 指针,那么通过dn指针来操作该地址内成员时,就取决于在定义dn时所指定数据类型(Data1),因此 dn->a 就可以正确从这个地址取出前 4 个字节,然后作为一个int

51240

C++核心准则ES.48:避免使用类型转换

类型转换在系统级编程是必要。例如,不然我们怎么获得登录到指针派生类类型设备?然而,类型转换已经被严重地过度使用,从而变成了错误主要来源之一。...译者注: [[nodiscard]]是C++17引入新特性,如果调用了返回值声明为[[nodiscard]]运算而没有处理返回值,C++17鼓励编译器发布警告。..., safe, implicit conversions between pointer types 依靠指针类型之间经过良好定义,安全,显式类型转换。...强制消除C风格类型转换,除了将[[nodiscard]]函数返回值转换为void之外。...如果目的类型和源类型相同,针对指针类型之间身份转换发布警告。 Warn if a pointer cast could be implicit. 如果指针类型转换可能会隐式发生,发布警告

60920

clang_intprt_t类型探究

return 0; } 只看op == LC这段代码,ax是一个int类型,存放值是char *指针类型地址,取完该地址所在值再赋给变量ax 但是如此写代码,vimyoucomplete插件一直报错...我们探讨一下原因,32位和64int类型都是4个字节,但是指针类型大小不一致 #include int main() { int *p; printf("the...[rbp-0xc]处 139行,将地址传给了rax寄存器,注意rax是16字节(对应题目中指针大小),对应下图2行,rax存储就是(A,B) 140行,对应下图3行指令eax是rax低位,存储值就是...eax表达出来是负数,rax高位补出来是全f;同理eax正数情况下,rax高位补全才是0 解决方案 在c99标准库里面有一个结构体,intptr_t可以实现编译器位数兼容性 //头文件stdint.h...‘X*’ to ‘Y’ loses precision” a hard error and what is suitable fix for legacy code C语言指针转换为intptr_t类型

1K100

【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

Institute 美国国家标准学会, 即标准C; -- 通用指针类型 : ANSI C中使用 void* 作为通用指针类型, 即指向void指针, void 是空类型, void* 是空类型指针,...默认返回值 : C , 如果没有标明返回值类型, 默认返回值不是 void, 是 int 类型; -- void参数 : C 语言中参数是void, 传入参数不会出错, C++传入参数会出错,...因此这里我们统一规定, 如果函数没有参数, 就定义为void; . (2) void*简介 void * 作用 :  -- 通用数据类型 : void * 指针可以存放任意类型数据地址, 任何数据类型指针都可以赋值给...: 标准C 规定 void * 类型不允许进行 加减乘除 算数运算, 因为我们不知道这个类型大小, GUN void * 等价于 char * ; 2....for built-in function ‘strlen’, 原因是 C语言中已经有了 strlen 函数了, 如果改一个函数名, 就不会有这个警告了; [root@ip28 pointer]#

3.9K20

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

条款11:在operator=处理“自我赋值” 请记住 ■ 确保当对象自我赋值时operator=有良好行为。...你应该在你所有接口中努力达成这些性质。 ■ “促进正确使用”办法包括接口一致性,以及与内置类型行为兼容。...条款25:考虑写出一个抛异常swap函数 请记住 ■ 当std::swap对你类型效率不高时,提供一个swap成员函数,并确定这个函数抛出异常。...■ 因类型参数(type parameters)而造成代码膨胀,往往可降低,做法是让带有完全相同二进制表述(binary representations)具现类型(instantiation types...条款45:运用成员函数模板接受所有兼容类型 请记住 ■ 请使用member function templates(成员函数模板)生成“可接受所有兼容类型函数

65020

c语言基础学习07_指针

、取地址运算符 &、无类型指针指针占用内存说明、野指针 与 空指针、空指针理解扩展、指针兼容性(即指针类型之间一定要匹配)、 不同数据类型在内存占用地址、指向常量指针指针常量、指针与数组关系...即指针类型兼容。那么我们强转试试!...============= 指针兼容性(即指针类型之间一定要匹配) 指针之间赋值比普通数据类型赋值检查更为严格,例如:不可以把一个 double * 赋值给int。...8 9 return 0; 10 } 警告如下: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types...] 警告兼容指针类型分配[-Wincompatible-pointer-types] =======================================================

1.4K10

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

一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父类 : 需要 基类 ( 父类 ) 对象...子类对象 , 父类指针 值为 子类对象 在 堆内存 地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针 ; 引用 : 父类引用 引用 子类对象 , 将 子类对象 赋值给 父类类型引用 ; 二...或 父类引用 , 此处可以直接传入 子类指针 或 子类引用 ; // 函数接收父类指针类型 // 此处可以传入子类对象指针 void fun_pointer(Parent* obj) { obj...{ cout << "子类 funChild 函数" << endl; } }; // 函数接收父类指针类型 // 此处可以传入子类对象指针 void fun_pointer...child.funParent(); // 将指向子类对象指针传给接收父类指针函数 // 也是可以 fun_pointer(&child); // 接收父类引用

22020

C++四种类型转换以及const_cast是否能改变常量问题

+四种类型转换总结如下: const_cast(expr) 用来移除对象常量性(cast away the constness) const_cast一般用于指针或者引用 使用...编译器隐式执行任何类型转换都可以由static_cast完成 当一个较大算术类型赋值给较小类型时,可以用static_cast进行强制转换。...可以将void*指针转换为某一类型指针 可以将基类指针强制转换为派生类指针,但是不安全。...如果你遇到不能将整型转变为函数指针问题,你可以这样解决: reinterpret_cast(nAddress); 注意LPFUN这里有个“&”符号,表示引用,C++引用其实就是用指针实现...记住,只有当const限定符加在已经初始化全局变量前面的时候,此时变量处在.rodata段(linux下),才是真正不可修改,否则通过指针都是可以修改,虽然编译过程中会产生警告

1.3K100

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

一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父类 : 需要 基类 ( 父类 ) 对象...子类对象 , 父类指针 值为 子类对象 在 堆内存 地址 , 也就是 将 子类对象 地址 赋值给 父类类型指针 ; 引用 : 父类引用 引用 子类对象 , 将 子类对象 赋值给 父类类型引用 ; 二...或 父类引用 , 此处可以直接传入 子类指针 或 子类引用 ; // 函数接收父类指针类型 // 此处可以传入子类对象指针 void fun_pointer(Parent* obj) { obj...{ cout << "子类 funChild 函数" << endl; } }; // 函数接收父类指针类型 // 此处可以传入子类对象指针 void fun_pointer...child.funParent(); // 将指向子类对象指针传给接收父类指针函数 // 也是可以 fun_pointer(&child); // 接收父类引用

8800

你该知道C++四种显式类型转换

这个检查主要来自函数(virtual function) 在C++面对对象思想,虚函数起到了很关键作用,当一个类拥有至少一个虚函数,那么编译器就会构建出一个虚函数表(virtual method...a pointer to a function of a different type (从指向函数指针转向另一个不同类型指向函数指针) A pointer to an object to a...pointer to an object of a different type (从一个指向对象指针转向另一个不同类型指向对象指针) A pointer to a member to a pointer...types (从一个指向成员指针转向另一个指向类成员指针!...或者是类型,如果类型成员和函数都是函数类型或者对象类型) 下面这个例子来自 MSDN 一个哈希函数辅助 // expre_reinterpret_cast_Operator.cpp // compile

1.8K20

听GPT 讲Go源代码--types.go

同样将该地址转换为unsafe.Pointer类型。 利用Go语言多重赋值机制,交换两个元素值。...这个函数主要是由内部库和编译器使用建议在用户代码中直接使用。...Store Store函数是用来把一个值存储到指定内存地址。它作用相当于C语言中指针赋值。 该函数接收两个参数:一个是存储地址,另一个是要存储值。...storePointer函数就是用来更新指针。 该函数将一个指针类型地址和该指针指向对象指针一起传递做参数,并将该指针指向新对象指针赋值给原先传递进来指针类型地址。...由于GC需要追踪所有指针,因此对指针修改必须是原子,并且不能写入缓存。如果遵守这些原则,就会使GC找不到所有的指针对象,从而导致内存泄漏。

23240

【嵌入式开发】C语言 命令行参数 函数指针 gdb调试

函数指针指针函数 (1) 指针函数 概念 : 函数返回结果是一个地址, 即返回是一个指针, 这个函数就是指针函数; 指针函数格式 : 类型说明符 *函数名(参数列表); -- 示例 : char..., 数组元素师字符串, 即char类型指针 char *lineptr[MAXLINES]; /* * 声明函数指针 */ int (*p_get_line)(char *, int); int...将 指向函数指针指针 类型改为 char*, *(char)&p 就是 取出转换类型函数指针, 这个是已经转换好类型函数指针; -- (char)fun : 将fun函数 函数指针转换为 char...类型, 函数入口地址转换为 char 类型; -- *(char*)&p = (char)fun : 指的是将函数地址 赋值指针变量p; -- (*p)() : 调用这个 指针 指向函数;...)())[5] : 数组元素是 char 类型; 5.

59630

Go里面的unsafe包详解

来自go语言官方文档警告 unsafe包文档是这么说: 导入unsafe软件包可能不可移植,并且不受Go 1兼容性指南保护。...让我们阅读unsafe包文档列出规则: 任何类型指针值都可以转换为unsafe.Pointer。 unsafe.Pointer可以转换为任何类型指针值。...这些规则与Go规范一致: 底层类型uintptr任何指针或值都可以转换为指针类型,反之亦然。 规则表明unsafe.Pointer类似于c语言中void 。当然,void 在C语言里是危险!...,已经确认: 在unsafe包函数签名将不会在以后Go版本更改, 并且unsafe.Pointer类型将在以后Go版本始终存在。...所以,unsafe包三个函数看起来危险。 go team leader甚至想把它们放在别的地方。 unsafe包这几个函数唯一不安全是它们调用结果可能在后来版本返回不同值。

1.1K40

【嵌入式开发】C语言 指针数组 多维数组

内存分配原理 : 设置一个大数组, 内存分配就分配这个数组空间, alloc 和 afree 函数操作指针, 不是数组, 因此这个数组可以隐藏, 将数组定义为static 类型, 那么在其它文件...alloc_buf, 将char数组首地址赋值给char类型指针; -- 初始化内容 : 0 或者 地址; -- 地址限定 : 对指针初始化地址, 该地址存储数据类型必须是该指针类型;  内存可用判断.../a.out length = 10 指针差值类型 :  -- ptrdiff_t : 该类型定义在 stddef.h 头文件, 表示两个指针之间带符号差值; -- size_t : 该类型定义在...++ 下一个元素都指向下一个 同类型元素; 指针之间有效运算 : 除下面几种合法运算之外, 其它运算都是非法, 但不会报错, 会警告; -- 赋值 : 同类型指针之间赋值运算; -- 算数 :...int 类型 * 将int 类型数据 赋值给 char 类型, 就是截取 int 最后8位 即一字节赋给char变量 * * 循环条件 : * 输入字符数超过 定义 MAXLEN

91660

C++学习笔记3

在调用函数时,传递给函数实參必须与对应形參类型兼容。 给函数传递实參遵循变量初始化规则。非引用类型形參以对应实參副本初始化。对(非引用)形參不论什么改动仅作用于局部副本。...在 C++ 函数能够重载。 仅仅要函数形參个数或类型不同,则同一个函数名可用于定义不同函数。编译器将依据函数调用时实參确定调用哪一个函数。...,对lengthCompare 不论什么使用都被解释为例如以下类型指针: bool (*)(const string&, const string &); // 可使用函数名对函数指针做初始化或赋值...type pf2 = pf1; // ok: pointer types match // 此时。...将函数指针初始化为0,表示该指针指向不论什么函数

24210
领券