指针

几个方便编程的C++特性

二次信任 提交于 2020-03-20 11:52:04
前言: C++11的自动化特性给编程提供了不少方便,同时也给调试增加了很多负担,至于取舍看程序员的风格和侧重而定。 auto:自动类型推断   在C++11之前,auto关键字用来指定 存储 期。在新标准中,它的 功能变为类型推 断。auto现在成了一个类型的占位符,通知编译器去根据初始化 代码推断所声明变量的真实类型。各种作用域内声明变量 都可以 用到它。例如,名空间中,程序块中,或是for循环的初始化语句中。   auto i = 42; // i is an int auto l = 42LL; // l is an long long auto p = new foo(); // p is a foo*   使用auto通常意味着更短的代码(除非你 所用 类型是int,它会比auto少一个字母)。试想一下当你遍历STL容器时需要声明的那些迭代器(iterator)。现在不需要去声明那些typedef就可以得到简洁的代码了。   std::map> map; for(auto it = begin(map); it != end(map); ++it) { }   需要注意的是,auto不能用来声明函数的返回值。但如果函数有一个尾随的返回类型时,auto是可以出现在函数声明中返回值位置。这种情况下,auto 并不是告诉编译器去推断返回类型

恼人的函数指针(二):指向类成员的指针

ε祈祈猫儿з 提交于 2020-03-20 07:50:01
3 月,跳不动了?>>> 前面曾写过一篇 恼人的函数指针(一) ,总结了普通函数指针的声明、定义以及调用,还有函数指针数组,函数指针用作返回值等。但是作为C++的研读,我发现我漏掉了一个最重要的内容,就是 指向类成员的指针 ,这里将做相应补充(相关代码测试环境为vs 2010)。 指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员),下面一一做介绍: 一、指向类的普通成员的指针( 非静态 ) 1、指向类 成员函数 的指针 简单的讲,指向类成员函数的指针与普通函数指针的区别在于,前者不仅要匹配函数的参数类型和个数以及返回值类型,还要匹配该函数指针所属的类类型。总结一下,比较以下几点: a)参数类型和个数 b)返回值类型 c) 所属的类类型 (特别之处) 究其原因,是因为非静态的成员函数必须被绑定到一个类的对象或者指针上,才能得到被调用对象的 this 指针,然后才能调用指针所指的成员函数(我们知道,所有类的对象都有自己数据成员的拷贝,但是成员函数都是共用的,为了区分是谁调用了成员函数,就必须有this指针,this指针是隐式的添加到函数参数列表里去的)。 明白了这点,接下来就简单了。 声明 :与普通函数作为区分,指向类的成员函数的指针只需要在指针前加上类类型即可,格式为: typedef 返回值 ( 类名:: *指针类型名)(参数列表);

指针函数/函数指针/指针数组/数组指针 区别

∥☆過路亽.° 提交于 2020-03-20 04:32:30
今天又遇到了指针数组,理解通道数据搞了半天。。。 bool LocalFileSaver::SaveADCData(Cash *data, LPCTSTR folder) { if (_tcscmp(folder, _T("")) == 0) { return false; } TCHAR path[MAX_PATH] = { 0 }; TCHAR fileName[128] = { 0 }; char sn[24] = { 0 }; strcpy(sn, data->GetSN()); if (sn[0] == '\0') { sprintf(sn, "0"); } wsprintf(fileName, _T("%04d%02d%02d_%02d%02d%02d_%03d_Err%03d_LastErr0x0_Den%d_Dir%d_Ver%02d_SN%s_adc.raw"), runCashStartTime.wYear, runCashStartTime.wMonth, runCashStartTime.wDay, runCashStartTime.wHour, runCashStartTime.wMinute, runCashStartTime.wSecond, data->Id(), data->GetError(), data->GetDenomination(),

C++类成员函数指针使用介绍

喜欢而已 提交于 2020-03-20 01:15:27
3 月,跳不动了?>>> 前言 在之前写过的博客中有介绍过函数指针和指针函数的区别和简单用法(文章在这里),当时的Demo非常简单,都是C语言的写法,但是当在C++中直接像C那样使用类成员函数指针时就会报错:reference to non-static member function must be called 所以如果是C++中的成员函数指针其使用方法是有区别的,这里针对不同的场景做个补充说明。 类成员函数的指针(非静态) 指向类成员函数的指针与普通函数指针的区别在于,前者需要匹配函数的参数类型和个数以及返回值类型,还要匹配该函数指针所属的类类型。 这是因为非静态的成员函数必须被绑定到一个类的对象或者指针上,才能得到被调用对象的this指针,然后才能调用指针所指的成员函数(所有类的对象都有自己数据成员的拷贝,但是成员函数都是共用的,为了区分是谁调用了成员函数,就必须有this指针,this指针是隐式的添加到函数参数列表里去的)。 所以,对于类成员函数的指针使用包含以下几个步骤: 声明: 指向类的成员函数的指针需要在指针前面加上类的类型,格式为: typedef 返回值 (类名::*指针类型名)(参数列表); 赋值: 需要用类的成员函数地址赋值,格式为: 指针类型名 指针名 = &类名::成员函数名; 1 注意:这里的这个&符号是比较重要的:不加&

指针重温(一)

心已入冬 提交于 2020-03-19 13:30:47
🔺定义 内存地址的变量。 int a = 3; int *pa; pa = &a; //&为取址运算符,表示取变量a的地址 printf("a = %d\n", a); printf("*pa = %d\n", *pa); printf("pa = %p\n", &a); printf("pa = %p\n", pa); 输出结果: 学习第一步:分清不同变量名最后输出的是什么内容,是地址还是常数。 总结: a是存放值的变量名,pa是指向变量a的指针变量名,也就是说pa里头存放的是a的地址,所以pa == &a。 *是间接运算符,也可叫做取值运算符,也可叫解引用运算符,所以*pa是取pa存放的地址里存放的值 就是3。 🔺声明指针 声明指针变量时必须指定指针所指向变量的类型。 声明时,*和指针之间的空格可有可无,通常,程序员在声明时使用空格,在解引用时省略空格。 ·编写程序时,可以认为变量有两个属性:名称和值(还有其他性质,例如类型,但是暂且不论)。 ·计算机编译和加载程序时,变量也有两个属性:地址和值。地址就是变量在计算机内部的名称。 🔺指针和数组 **指针和一维数组 一维数组名是数组首元素地址 int array[4] = {0, 1, 2, 3}; int *parray; int i; parray = array; for (i=0; i<4; i++) printf(

智能指针实例

佐手、 提交于 2020-03-19 12:58:25
摘要: 智能指针:通过C++模板技术实现的一个类模拟指针的行为(如->、*) 1. 内存泄漏(臭名昭著的Bug) (1)动态申请堆空间,用完后不归还(堆空间越来越少,的那个程序长时间运行,就会导致总堆空间内存没有了) (2)C++语言中没有垃圾回收的机制 (3)指针无法控制所指堆空间的生命周期(指针是变量,有生命周期,即一个局部指针指向了堆空间之后,当该指针的生命周期结束后,这段堆空间的生命周期并没有结束,这就发生了泄漏) 2. 当代C++软件平台中的智能指针 (1)指针生命周期结束时主动释放堆空间 (2)一片堆空间最多只能由一个指针标识(一片堆空间最多只能由一个指针 可以避免多次释放对空间的问题,因为如果有两个指针同时指向同一块内存空间,内存空间有可能会被释放两次造成内存错误) (3)杜绝指针运算和指针比较 3.智能指针的设计方案 (1)通过类模板描述指针的行为,能够定义不同类型的指针对象 (2)重载指针特征操作符(->和 *),利用对象模拟原生指针的行为 (3)智能指针的使用军规:只能用来指向堆空间中的单个对象(即不能指定一个数组对象的空间)或者变量 【编程实验】智能指针 Smartpointer.h #ifndef SMARTPOINTER_H #define SMARTPOINTER_H namespace DTLib { template < typename T >

两个有序链表合成一个有序链表

元气小坏坏 提交于 2020-03-19 12:03:06
1 #include<iostream> 2 #include<cstdlib> 3 using namespace std; 4 #define MAXa 5//La链表中的元素数量 5 #define MAXb 7//Lb链表中的元素数量 6 typedef struct node{//定义链表中的节点 7 int data;//存储数据 8 struct node *next;//存储指向下一个节点的指针 9 }Lnode; 10 void creatlist(Lnode *head, int *arr, int n);//创建链表 11 void printlist(Lnode *head);//打印链表 12 void mergelist(Lnode *headA, Lnode *headB, Lnode *headC);//合并链表 13 int main(){ 14 int a[MAXa] = { 1, 3, 5, 7, 9 };//先将元素存储到数组中,再存到链表中 15 int b[MAXb] = { 2, 4, 6, 8, 10 ,11,45}; 16 Lnode *La, *Lb, *Lc;//分别定义La链表、Lb链表、Lc链表的头节点 17 La = (Lnode*)malloc(sizeof(Lnode));//动态分配空间 18 La->next =

PHP 常用函数

二次信任 提交于 2020-03-19 11:22:12
变量: var_dump($val) 、 print_r($val) //打印变量 serialize($val)、unserialize($val)//用于序列化对象或数组,并返回一个字符串 类型转换: (int),(bool),(float),(string),( array ),(object)($val); $b=(int)$ a; //把$a转换为整形 intval (), floatval (); strval () $b= intval ($ a);//获取$a中整形数值 类型 判断: empty() / isset() / unset() // isset函数用于检测变量为非null值; empty判断是否为"空",其中 空字符串、0、false都为真; is_bool /int/float/string/ array /object/resource/null() is_numberic();’ //判断是否为任何类型的数字或者数组字符串 is_callable (); //判断是否为有效函数名称 eg:is_int ($val); //判断 b是否为整形,返回bool值 字符串函数: strlen($str);//返回字符串长度 mb_strlen($str) 可以返回中文字符长度; strtolower($str);//字母转小写 strtoupper(

C语言总结2

廉价感情. 提交于 2020-03-19 08:42:36
12).预处理指令 1. 什么叫做预处理代码. 以#开头的代码就是预处理代码 #warning #import 2. 手写1个C程序的步骤.(面试题) 1>编写代码 2>编译 1)执行.c中的预处理代码 2)检查语法 3>链接 4>执行 3. 预处理指令的分类.(面试题) ****** 1>文件包含指令 #include 2>宏定义 #define (用来替换代码) 3>条件编译 #if (满足一定的条件才编译) 4. 预处理指令的特点. 1>都是以#开头 2>后面没有分号 3>在编译的时候,检查语法之前进行 "注意 以#开头的代码就是预处理代码 13).sizeof运算符 sizeof运算符的作用? 作用:计算常量,变量在当前系统上内存中所占的字节数 sizeof (数据类型) sizeof (变量)-----用的最多! sizeof (常量) 注意, char类型的变量在内存中占1个字节; char类型的常量在内存中占4个字节; 综上所述,为了安全起见,sizeof后面最好加上括号! 14).按位异或 ^ 异或运算 不同为1,相同为0 注意: 1 相同整数相^的结果是0; 2 一个整数^另一个整数2次结果不变 ; 3^2^2 = 3 3 整数相^跟顺序无关 3^2^3 = 2^3^3 = 2 15). 按位左移或者右移 1,按位左移运算. << 参与按位左移运算的二进制数据.

指针系统学习2

故事扮演 提交于 2020-03-19 08:42:14
1.数组与指针   一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。   指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。   所谓数组元素的指针就是数组元素的地址。 2.指向数组元素的指针   定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。   例如:   int a[10];(定义a为包含10个整型数据的数组)   int *p; (定义p为指向整型变量的指针变量)。   应当注意,如果数组为int型,则指针变量的基类型亦应为int型。 3.下面是对该指针变量赋值:   p = &a[0];把a[0]元素的地址赋给指针变量p。 也就是使p指向a数组的第0号元素,见图 -->> 4.通过指针引用数组元素:   引用一个数组元素,可以用:   (1) 下标法,如 a[i] 形式;   (2) 指针法,如*(a+i)或*(p+i)。   其中的a是数组名,p是指向数组元素的指针变量,其初值 p=a。   注意:数组名即“翻译成数组的第一个元素的地址! 例题: 输出数组中的全部元素 假设有一个a数组,整型,有10个元素。要输出各元素的值有三种方法: (1) 下标法 #include <stdio.h> void main() { int a[10]; int i; for(