c语言指针

C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

偶尔善良 提交于 2019-11-29 13:46:31
C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast 1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换格式1 type-id(expression)//转换格式2 c++除了能使用c语言的强制类型转换外,还新增了四种强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast,主要运用于继承关系类间的强制转化,语法为: static_cast<new_type> (expression) dynamic_cast<new_type> (expression) const_cast<new_type> (expression) reinterpret_cast<new_type> (expression) 备注:new_type为目标数据类型,expression为原始数据类型变量或者表达式。 《Effective C++》中将c语言强制类型转换称为 旧式转型 ,c++强制类型转换称为 新式转型 。 2. static_cast、dynamic_cast、const_cast、reinterpret_cast static_cast static

const 详解(修饰变量、输入参数、返回值、成员函数)

这一生的挚爱 提交于 2019-11-29 13:44:07
C语言函数中的参数有const的问题,具体代码如下 照理说有const的参数怎么还能执行*strDest++=*strSrc++;呢 请大师解答 char* Copy(char* strDest,const char* strSrc) { char* strDestCopy = strDest; while (*strSrc!='\0') { *strDest++=*strSrc++; } return strDestCopy; } 首先,你得先区分const char* a和char* const a的区别。 一个是把指针定为const 。就是不能修改指针。也就是char * const p 一个是把指针指向的内容定为const 。就是不能修改指针指向的内容 也就是const char p 在这里,const char strSrc表示的是不能修改指针指向的内容,但是对于*strDest++=*strSrc++; 只是在修改指针strSrc的指向,所以是可以成立并且执行的,不明白继续追问 C语言中const有什么用途 是一道专接本的简答题,要求至少说出两种const的用途 还有一道题是软件测试都有哪些种类 请高手帮忙 fsyss1314 | 浏览 162269 次 发布于2015-05-17 22:48 最佳答案 const修饰的数据类型是指常类型

网易互娱我来辣

岁酱吖の 提交于 2019-11-29 12:32:55
static的作用: 1.第一条也是最重要的一条:隐藏 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏 2.static的第二个作用是保持变量内容的持久 3.static的第三个作用是默认初始化为0 虚函数,具体怎么实现 https://blog.csdn.net/weixin_40237626/article/details/82313339 指针和引用的区别: 内存分配: 指针是一个实体,需要分配内存空间。引用只是变量的别名,不需要分配内存空间。 初始化: 引用在定义的时候必须进行初始化 , 并且不能够改变。 指针在定义的时候 不一定要初始化 , 并且指向的空间可变。 使用级别:有多级指针,但是没有多级引用,只能一级引用。 自增运算:指针和引用的自增运算结果不一样。(指针是指向下一个空间,引用时引用的变量值加1) 使用sizeof时: 引用得到的是所指向的变量(对象)的大小,而sizeof 指针得到的是指针本身的大小。 直接与间接访问: 引用访问一个变量是直接访问

c++ 之 类型转换

纵然是瞬间 提交于 2019-11-29 12:16:59
一、隐式类型转换 int m = 3 + 45.6; //48.6000000000 截断为48,将小数部分进行截断 二、C风格 显式类型转换(强制类型转换) //int k = 5 % 3.2; 编译器报错int k = 5 %(int)3.2; //C语言风格的强制类型转换,但需要程序员来保证数据正确可转 int k = 5 % int(3.2); //函数风格的强制类型转换(C语言风格的强制类型转换中的一种) int k = 5 %(int)"dddd"; //C语言风格的强制类型转换,但结果肯定错误 //所以C语言风格的强制类型转换是一种不安全的类型强制转换 三、C++类型转换 //C++出来支持C风格的类型转换,但提供4中C++的强制类型转换,分别用于不同的目的//目的是为了提供丰富的含义和功能,更好的类型检查机制,方便代码的书写与维护 1.static_cast2.dynamic_cast3.const_cast4.reinterpret_cast这四种强制类型转换被称为 "命名的强制类型转换" 1.static_cast:静态转换(可以理解为C风格的强制类型转换,但编译器会检查其合法性) //通用形式//强制类型转换名<type>(express);1.static_cast:静态转换(可以理解为C风格的强制类型转 换,但编译器会检查其合法性) 可用于 a

【C语言笔记】#define与typedef的区别

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-29 08:27:04
1、#define define是预处理指令,在编译时不进行任何检查,只进行简单的替换 宏定义的一般形式为: #define 宏名 字符串 这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同,它不需要双引号。 2、typedef typedef是在C语言中用来为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。 typedef取别名的一般形式为: typedef 旧名字 新名字 3、define与typedef的区别 (1)#define之后不带分号,typedef之后带分号。 (2)#define可以使用其他类型说明符对宏类型名进行扩展,而 typedef 不能这样做。如: #define INT1 int unsigned INT1 n; //没问题 typedef int INT2; unsigned INT2 n; //有问题 INT1可以使用类型说明符unsigned进行扩展,而INT2不能使用unsigned进行扩展。 (3)在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define 则无法保证。如: #define PINT1 int*; P_INT1 p1,p2; //即int *p1,p2;

C语言指针(一)

若如初见. 提交于 2019-11-29 08:25:19
指针与地址 一元运算符&可用于取一个对象的地址,地址运算符&只能应用于内存中的对象,即变量与数组元素。不能作用于表达式、常量或者register类型的变量。 p = &c; 一元运算符* 是 间接寻址 或 间接引用运算符 。当它作用于指针时,将访问指针所指向的对象,下面代码段说明了程序中如何使用&和*: int x = 1, y = 2, z[10]; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ y = *ip; /* y is now 1 */ *ip = 0; /* x is now 0 */ ip = &z[0]; /* ip now points to z[0] */ int * ip ,该声明表明表达式*ip的结果是int类型。 指针只能指向某种特定类型的对象(一个类外是指向void类型指针可以存放指向任何指针,但他不能间接引用自身) 一元运算符*和&的优先级比算术运算符的优先级高。但是下面表达式中圆括号是必须的,否则,该表达式将对ip进行加1运算,这是因为,类似于 *和++这样的一元运算符遵循从右至左的结合顺序。 (*ip)++ 指针也是变量,所以程序中可以直接使用,不用通过间接引用的方法使用。若iq是另一个指向整型的指针,那么下式表示将ip的中的值拷贝到iq中

c语言单向链表

落花浮王杯 提交于 2019-11-29 03:21:55
一、链表概述     链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。 链表的各类操作包括:学习单向链表的创建、删除、 插入(无序、有序)、输出、 排序(选择、插入、冒泡)、反序等等。 二、链表创建、删除、插入等如下,将函数与声明定义进行分离为.h和.c: 2.1 linklist.h 1 #pragma once 2 typedef struct list 3 { 4 int data;//数据域 5 struct list *next;//指针域 6 }LinkList; 7 LinkList *crate_list(); //建立一个节点 8 void traverse(LinkList*ls);//循环遍历链表 9 LinkList* insert_list(LinkList* ls, int n, int data);//在指定位置插入元素 10 int

重学C语言之结构体

我与影子孤独终老i 提交于 2019-11-29 02:57:11
概念 结构体是一种构造类型,由若干个成员组成,成员可以是基本数据类型,或是另一个结构体 声明结构体 struct 结构体名 { 成员列表 }; 结构体名表示结构的类型名。 声明一个结构体表示创建一种新的类型名(自定义数据类型),然后用类型名定义变量。 struct Product { char name[10]; char shape[10]; char color[10]; float price; } 使用结构体定义变量有三种方式 第一种:声明结构体类型,再定义变量 struct Product p1; struct Product p2; p1和p2是结构体变量名,这两个变量具有相同的结构 类比: 类型名 变量名 int a; | | struct Product p; struct Product整体表示一种数据类型 定义结构体变量后,系统会为其分配内存单元 第二种:声明结构体类型时,同时定义变量(可以定义多个变量) struct 结构体名 { 成员列表 } 变量名列表; example: struct Product { char name[10]; char shape[10]; char color[10]; float price; } p1, p2; 第三种:直接定义结构体类型变量(匿名结构体,没有结构体名称) struct { 成员列表 } 成员变量;

MFC学习笔记

China☆狼群 提交于 2019-11-29 00:59:42
课题需要,要用MFC,简单记下学习知识点。 int WINAPI MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType ); WINAPI 为宏定义 #define WINAPI __stdcall LPCTSTR 是自定义数据类型,等价于 const char * 凡是以 “P” 开头的都是指针(pointer)类型("LP"是老式写法) Windows 数据类型名命名的规律 无符号类型:一般是以“U”开头,比如“INT”对应的“UINT”。 指针类型:其指向的数据类型前加“LP”或“P”,比如指向 DWORD 的指针类型为“LPDWORD”和“PDWORD”。 句柄类型:以“H”开头。比如,HWND 是window(WND简写)也就是窗口的句柄,菜单(MENU)类型对应的句柄类型为 “HMENU” 等等。 typedef int INT; /* 整形 */ typedef unsigned int UINT; /* 无符号整形 */ typedef unsigned int *PUINT; /* 无符号整形指针 */ typedef int BOOL; /* 布尔类型 */ typedef unsigned char BYTE; /* 字节 */ typedef unsigned short

C++的四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)

≯℡__Kan透↙ 提交于 2019-11-29 00:17:27
static_cast 相当于C语言中的强制转换:(类型)表达式或类型(表达式),用于各种隐式转换 非const转const、void*转指针、int和char相互转换 用于基类和子类之间的 指针和引用 转换,非指针直接报错 向上转化是安全的,如果向下转能(指针或引用)成功但是不安全,结果未知; dynamic_cast 用于动态类型转换。只能用于含有 虚函数 的类,必须用在多态体系种,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。 在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。 如果没有virtual方法进行下行转换(指针或引用)会直接报错 const_cast 常量指针被转化成非常量的指针,并且仍然指向原来的对象; 常量引用被转换成非常量的引用,并且仍然指向原来的对象; const_cast一般用于修改底指针。如const char *p形式。 const int a=10; int *p=const_cast<int*>(&a); //p和a指向同一块内存地址 *p = 100; //修改*p,但a=10,*p=100 reinterpret_cast (重解释转换)几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用;随意的转换编译都会通过