函数指针

C++传值和传引用

匿名 (未验证) 提交于 2019-12-03 00:08:02
首先你肯定明白一个道理:当初始化一个非引用类型的变量时,初始值被拷贝给变量,此时对变量的改动不会涌向初始值 int n = 0 ; int i = 1 ; // i是n的副本 i = 42 ; // i的值改变,n的值不改变 传值参数的机理完全一样,由于 每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化 ,所以 函数对形参做的所有操作不会影响实参 ,如果我们想让函数改变我们传入的实参本身们就可以用到 指针形参 访问函数外部对象 先看一段代码: int n = 0 ; int i = 1 ; int * p1 = & n ; //p1指向n int * p2 = & i ; //p2指向i * p1 = 42 ; //n的值改变,p1不变 p1 = p2 //现在p1指向了i,但是i和n的值都不变 当执行指针拷贝操作时,拷贝的是指针的值(地址),拷贝之后,两个指针是不同的指针,因为指针可以使我们间接地访问所指向的对象,所以通过指针可以修改对象的值 指针形参也差不都 // 接受一个int类型的指针,然后将指针所指向的对象置0 void reset ( int * ip ) { * ip = 0 ; // 改变指针ip所指向对象的值 ip = 0 ; // 只改变了ip的局部拷贝,实参未被改变 } void reset ( int i ) { i = 0 ; } int

字符串、字符和字节

匿名 (未验证) 提交于 2019-12-03 00:05:01
C语言中没有显示的字符串数据类型,字符串以字符串常量或者字符数组的形式出现,字符串常量适用于那些程序不会对它们进行修改的字符串。所有其它字符串都必须存储于字符数组或动态分配的内存中。 字符串 是一串零个或多个字符,并且以一个位模式为全0的NULL字节结尾。 字符串所包含的的字符内部不能出现NULL字节。 NULL字节是字符串的终结符,但它并不是字符串的一部分,所以字符串的长度并不包含NULL字节。 字符串函数的声明都在 string.h 头文件中。 字符串的长度就是它所包含的字符个数,通常使用函数 strlen 来计算字符串的长度。 sizet_t strlen ( char const * string ); size_t 定义在 stddef.h 中,它是一个无符号整数类型。 在表达式中使用无符号数可能导致不必要的结果,如下: if ( strlen ( x ) >= strlen ( y ))... if ( strlen ( x ) - strlen ( y ) >= 0 )... 第二条语句的结果永远为真,因为strlen(x)、strlen(y)的返回值都是无符号数,所以>=左边是无符号数,无符号数不可能小于零。 最常用的字符串函数都是不受限制的,就是说它们只是通过寻找字符串参数结尾的NULL来判断它的长度。在使用这些函数时,必须要 保证结果字符串不会溢出内存。

C++中函数参数传递(非引用形参和引用形参)――学习笔记

匿名 (未验证) 提交于 2019-12-02 23:57:01
1、非引用形参-copy 指针是非引用,copy。但值也会改变。 引用形参: const相关问题: const形参可以拷贝、 不能修改,不能赋值! 可以使用const初始化非const: 指针+const 对于指针的const。非const传给const没问题。 引用形参还可用于不需要修改值的情况,最好加上const。 来源:博客园 作者: ostartech 链接:https://www.cnblogs.com/wxl845235800/p/11470750.html

C++内存管理

匿名 (未验证) 提交于 2019-12-02 23:57:01
new operator 我们平时使用的new是new操作符(new operator),就像sizeof一样是语言内置的,不能改变它的含义,功能也是一样的 比如: string * ps = new string ( "Memory Management" ); 相当于 void * memory = operator new ( sizeof ( string )); // 得到未经处理的内存,为String对象 call string :: string ( "Memory Management" ) on * memory ; // 调构造函数将字符串放到内存 string * ps = static_cast < string *>( memory ); // 使ps指针指向新的对象 new操作符总是做两件事: 1.调用相应的operator new分配内存 2.调用相应的构造函数 如下代码: class T { public : T (){ cout << "构造函数。" << endl ; } ~ T (){ cout << "析构函数。" << endl ; } void * operator new ( size_t sz ){ T * t = ( T *) malloc ( sizeof ( T )); //operator new就是简单的分配内存即可

函数指针数组的最佳实践

匿名 (未验证) 提交于 2019-12-02 23:54:01
1 #include<iostream> 2 #include<fstream> 3 #include<string.h> 4 using namespace std; 5 6 class Student; 7 8 typedef void(CALL)(Student*,int); 9 10 class Student 11 { 12 public: 13 string name; 14 int age; 15 char sex; 16 public: 17 Student(){} 18 ~Student(){} 19 }; 20 21 void write_object(Student *students,int size) 22 { 23 ofstream ofs("text.bat"); 24 if(ofs) 25 { 26 for(int i=0;i<size;i++) 27 { 28 cin>>students[i].name>>students[i].age>>students[i].sex; 29 ofs.write(reinterpret_cast<const char*>(&students[i]),sizeof(students[i])); 30 } 31 } 32 else 33 { 34 cout<<"write failed"<<endl; 35 } 36

C语言的内存管理

匿名 (未验证) 提交于 2019-12-02 23:52:01
堆和栈的区别: 栈的特征 执行的速度相对较快; 空间较小; 生存期由系统决定; 作用域较小; 有名空间,可以通过变量名或者数据名访问; 堆的特征 执行的速度相对较慢; 空间较大; 生存期由“自己”决定,malloc申请,free释放; 作用域很大(整个程序都可以访问); 无名空间,只能通过指针使用; C语言空间的申请 malloc 功能: 分配 size 字节的未初始化内存。若分配成功,则返回指向分配内存块最低位(首位)字节的,为任何拥有基础对齐的对象类型对齐的指针。 头文件: #include<stdlib.h> 原型: void* malloc( size_t size ); 参数: size - 要分配的字节数 返回值: 成功时:返回指向新分配内存的指针。为避免内存泄漏,必须用 free() 或 realloc() 解分配返回的指针。 失败时:返回空指针。 说明: malloc申请的空间为连续空间;malloc申请的是没有初始化的空间; 返回值类型是void * 该类型表明malloc返回的地址空间中的数据类型是不确定,必须经过强制类型转换才可以使用。 realloc 功能: 先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间

Golangѧϰ

匿名 (未验证) 提交于 2019-12-02 22:56:40
这篇文档零散的记载了一些知识点以及容易犯错的语法知识 结构体绑定方法分为两种情况:指针绑定和赋值绑定,下面是两种情况的地址情况 import "fmt" import "unsafe" type MyStruct struct { id int } func (self MyStruct) Assignment() { fmt .Println (unsafe .Pointer (&self)) } func (self MyStruct) modify_value_assignment() { self .id = 2 } func (self *MyStruct) Pointer() { fmt .Println (unsafe .Pointer (&self)) } func (self *MyStruct) modify_value_pointer() { self .id = 2 } func main() { s0 := MyStruct{ 1 } fmt .Println (s0) fmt .Println (unsafe .Pointer (&s0)) //打印地址 s0 .modify _value_assignment() fmt .Println (s0) // { 1 } s0 .Assignment () s0 .modify _value_pointer

C++ 程序设计

六月ゝ 毕业季﹏ 提交于 2019-12-02 18:40:14
C++的基本知识 C++的数据类型 变量和常量 运算符和表达式 基本的输入/输出方法 基本控制结构程序设计 分支结构程序设计 循环程序设计 break, continue控制语句 结构化程序设计思想 函数 函数的定义与调用 函授的参数传递、返回值与函数声明 变量的作用域和生存期 函数的递归调用 函数的重载 头文件与多文件结构 编译预处理 数组 一维数组的定义,初始化和访问 二位数组的定义,初始化和访问 用数组作为函数参数 字符串和字符数组 字符串函数 指针 指针与地址 this指针 数组与指针的关系 指针与函数 引用 自定义数据类型 结构体 动态内存分配 链表与链表的基本操作 枚举类型 类与对象 面向对象的程序设计 类与对象的概念与设计 构造函数和析构函数 复制构造函数 共有数据的保护 静态成员 友元 类模板 运算符的重载 继承与多态 继承与派生的概念 派生类的构造函数与析构函数 多重继承与派生类的成员标识 虚基类 多态性与虚函数 输入输出流 C++的输入输出流 文件的I/O操作 基本数据类型与输入输出 掌握各种基本数据类型的定义与操作;掌握cin和cout的用法;了解printf和scanf的用法 字符集与保留字 基本数据类型 变量与常量的定义 cin,cout printf, scanf 的用法 表达式和过程化语句 掌握表达式和语句的概念,掌握各种运算符的使用

函数指针做函数参数

安稳与你 提交于 2019-12-02 15:56:16
回调函数的本质:提前做了一个协定(把函数的参数、返回值提前定义好) 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 6 //任务实现者 7 int myadd(int a, int b) 8 { 9 printf("func add() do...\n"); 10 return a + b; 11 } 12 13 int myadd2(int a, int b) 14 { 15 printf("func add2() do...\n"); 16 return a + b; 17 } 18 int myadd3(int a, int b) 19 { 20 printf("func add3() do...\n"); 21 return a + b; 22 } 23 int myadd4(int a, int b) 24 { 25 printf("func add4() do...\n"); 26 return a + b; 27 } 28 29 typedef int (*MyTypeFuncAdd)(int a, int b); //定义类型 30 31 //任务调用者 32 int MainOp(MyTypeFuncAdd myFuncAdd) 33 { 34 int c

《C++ 习题与解析》笔记

人盡茶涼 提交于 2019-12-02 14:53:46
目录 ####Chapter-1 C++语言概述(错题) ####Chapter-2 类和对象 ####Chapter-3 引用 ####Chapter-4 友元函数 #### Chapter-5 运算符重载 #### Chapter-6 继承与派生(错题) #### Chapter-7 多态性和虚函数 #### Chapter-8 异常处理 C++基础: 基础数据类型,简单输入输出,流程控制语句,函数与编译预处理,数组,结构体,指针与引用 C++面向对象部分: 类与对象,构造和析构函数,继承与派生,友元,虚函数,静态成员,运算符重载 Chapter-1 C++语言概述 位运算操作符 单目:~(按位求反) 双目:&(与)、 |(或)、 ^(按位异或) 移位运算符 << (左移): 左移是将一个二进制数按指定的位数向左移位,移掉的位被丢弃,右边移出的空位一律补0 >> (右移): 右移是将一个二进制数按指定的位数向右移位,移掉的位被丢弃,左边移出的空位一律补0,或补符号位 逗号运算符 d1, d2, d3, d4: 计算一个逗号表达式的值时,从左至右依次计算各个表达式的值,最后计算的一个表达式的值和类型便是整个逗号表达式的值和类型 二维数组指针表示 //输出对应的值的三种方法 int b[2][3]; a. *(*(b+i)+j) b. *(b[i]+j) c. *(&b[0][0]