2.2 结构的声明 在函数中我们有学过,当我们要创建一个自定义行数时,我们需要先声明函数的返回类型、函数名以及函数的参数类型。 在结构体中也是如此。...当我们要创建一个结构体类型时,我们需要声明结构体的类型名、结构体成员的数据类型以及成员名。...2.4.1 结构体变量创建的区别 当我们在创建结构体变量时,对于不同的创建方式,其效果也是有区别的: 当我们在声明结构体时创建变量,那么该变量的作用域与结构体声明时的作用域是一致的 当我们在使用结构体时创建变量...2.4.2 重命名与变量创建 当我们对数据类型进行重命名时,有一点需要注意,重命名的过程中是无法创建变量的,如下所示: 因此,当我们在声明结构体类型并进行重命名时,我们是无法同步创建结构体变量的,如下所示...但是当我们用pt来接收t1的地址时,我们会发现此时程序报了警告,警告的内容是操作符两侧的类型不兼容。 也就是说,即使这两个匿名结构体的结构体成员是一致的,但是,系统会认为它们是两个不同的结构体类型。
引用 传值、传引用效率的比较 以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直 接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效...auto可以帮我们自动识别这个变量是什么类型,从我们现在学习编程的角度来看,可能意义不大,因为int还有char等等这些类型都是比较简单的,但当我们越往后学习,还有很多类型,代码量特别大,所以我们引入了...= m.end()) { //.... } return 0; } 上面代码看着就简洁的多 auto的使用规则 注意:如果auto后面带了一个*则后面的变量只能是指针类型的变量...,必须用引用,引用在for循环当中的e只是auto的一份临时拷贝,所以在范围for的遍历数组当中必须进行引用 指针空值(C++11) 在C++中,以前的C语言中的NULL,在底层的定义中是0,所以为了区别...class的默认访问权限为private,struct为public(因为struct要兼容C) C++的class和C语言中struct的区别 C++中的class默认是private,C语言中的struct
说好的今天讲指针,说到做到啦 一.指针概念 1.要学好指针首先要了解什么是指针,首先给个定义它是一种用来存储变量地址的变量类型,通常我们也会说指针其实就是一个地址,下面先看一段代码叭 这段代码的大意就是我定义了一个整型变量...2.解引用(用于访问指针所指向的内存单元的值) 当我们用指针访问到a的地址后,就可以不用直接操作a进而改变a的值,可以直接在a的地址中改变a的值(当然a的地址不变,只是地址中存储的值发生了改变),通过这个方法我们可以进行一些...提到变量我们首先就要考虑这个变量占多少字节 当然这里我就用了int char两个类型,我们不难发现在debug状态下x64中任意指针变量的字节都是8,x86中任意指针类型的字节都为4。...贴上一个错误代码示例 编译器会给出类型不兼容的警告,所以指针变量类型和你要访问的变量类型要保持一致。...当然所有的指针变量中有一个极为特殊,void*可以接受所有变量类型的地址并不会触发类型不兼容的警告,但它的缺陷就是不能进行解引用操作和接下来要讲的指针运算。
一、C语言中的类型转换 在 C 语言中,如果 赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化 , C 语言中总共有两种形式的类型转换...显式类型转换将所有情况混合在一起,代码不够清晰 因此 C++ 提出了自己的类型转化风格,注意 因为 C++ 要兼容 C 语言,所以 C++ 中还可以使用 C 语言的 转化风格 。...当我们用*p修改了a在内存中的值之后,打印a是打印寄存器中a的值,打印*p则是内存中a的值。所以结果会不同。.../引用转换为子类对象的指针或引用(动态转换) 向上转型:子类对象指针 / 引用 -> 父类指针 / 引用 ( 不需要转换,赋值兼容规则 ) 向下转型:父类对象指针 / 引用 -> 子类指针...dynamic_cast 会先检查是否能转换成功,能成功则转换,不能则返回 0 代码示例: 当我们用强制类型转换的时候,是可能会发生越界问题的。
栈由编译器自动分 配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。堆一般由程序员 分配释放, 若程序员不释放,程序结束时可能由OS 回收。分配方式类似于链表。...,两个资源的引用计数为2,当要跳出函数时,智能指针pa,pb析构时两个资源引用计数会减一,但是两者引用计数还是为1,导致跳出函数时资源没有被释放(A B的析构函数没有被调用),如果把其中一个改为weak_ptr...「static_cast」 用于非多态类型的转换 不执行运行时类型检查(转换安全性不如 dynamic_cast) 通常用于转换数值数据类型(如 float -> int) 可以在整个类层次结构中移动指针...而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先把内存释放掉。 「注意」:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认 的。...erase方法会返回下一个有效的迭代器,所以当我们要删除某个元素时,需要it=vec.erase(it);。
但它也可以用于获取变量的内存地址;即变量在计算机上存储的位置。当在 C++ 中创建一个变量时,会为该变量分配一个内存地址。当我们给变量赋值时,它将存储在这个内存地址中。...指针变量指向相同类型的数据类型(如 int 或 string),并使用 * 运算符创建。...注意指针的类型必须与你正在处理的变量的类型匹配。使用 & 运算符存储名为 food 的变量的内存地址,并将其分配给指针。现在,ptr 持有 food 的内存地址的值。...提示:声明指针变量有三种方式,但第一种方式是首选的:string* mystring; // 首选string *mystring;string * mystring;引用和指针的区别特性引用指针初始化必须初始化可以不初始化可空不允许空引用允许空指针可变性一旦初始化就不能改变引用指向的变量可以改变指针指向的变量解引用不需要解引用需要解引用效率通常比指针更有效率通常比引用效率低什么时候使用引用和指针使用引用...提高效率:引用比指针更有效率,因为不需要指针的解引用操作。使用指针:动态内存分配:指针用于动态分配和释放内存。复杂数据结构:指针用于访问和操作复杂数据结构,例如链表和树。
C++规定必须从左到右依次给实参,不能跳跃给实参,比如当我们给Func1函数传参时,可以只给a传,可以只给a,b传,也可以都传,但是不能跳过a给b传,因为这样编译器分不出来到底要传参给谁 函数声明和定义分离时... (1)引用在定义时必须初始化,这一点和指针不同,指针在定义时可以不初始化,而引用不初始化化就会报错 (2)一个变量可以有多个引用,也就是一个变量可以取多个别名,并且取别名后再对别名引用...,但是在数据结构上引用不能代替指针,比如链表,当我们删除节点后,一个引用不能改变指向引用到下一个节点 所以大部分情况下指针和引用相辅相成,大部分情况下可以使用引用代替指针,一些特殊情况下还是要使用指针...,那么我们返回a的别名,就变成了野引用,所以我们要保证我们返回的引用不是一个局部变量,而是一个即使函数栈帧被销毁了也依然存在的变量 (4)引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点...语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间(实际在汇编层引用的本质就是使用了指针,但是语法层面上引用没有开空间) 3.
指针变量和地址 2.1取地址操作符(&) 理解了内存和地址的关系,我们再回到c语言,当我们创建一个变量时,编译器将会开辟出空间来存储数据,存储数据空间的编号即为地址,例如当我们创建一个变量a时,要想获得他的地址...2.2.3 解引⽤操作符 解引用操作符是键盘上的*和乘号是一样的,当我们有一个指针变量时,我们可以在指针变量前用一个*,即可获取指针变量指向空间的值, int a = 100; int* pa = &...,占四个字节,而int*类型的指针变量一次解引用可以访问4个字节,而char*类型的指针变量一次解引用只能访问1个字节,并不能完全把n改为0,只能修改一个字节的空间的值。...编译器给出了⼀个警告(如下图),是因为类型不兼容。⽽使⽤void*类型就不会有这样的问题。 ,既然void*不能进行指针的计算,那void*类型有什么用呢,这个问题会在后面的文章进行讲解。...指针未初始化 当我们创建一个指针变量时,如果没有对他进行初始化,此时指针变量成为了野指针。
前言 C语言是结构化和模块化的编程语言,适合处理较小规模的程序,对于复杂、规模较大的问题,需要高度的抽象和建模时,C++更加合适。...、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,难免会导致冲突。...6.2引用的特性 引用在定义时必须初始化 一个变量可以有多个引用 引用一旦引用一个实体,再不能引用其他实体 6.3 引用的使用 函数调用过程中传参和返回值,没有了拷贝提高了效率 引用传参和指针传参是类似的...临时对象就是编译器需要一个空间暂存表达式的求职结果时临时创建的一个未命名的对象,C++把这个未命名对象叫做临时对象 6.5指针和引用的关系 语法概念上引用是给一个变量取别名不开空间,指针是存储一个变量的地址...,要开空间 引用在定义时必须初始化,指针可以不初始化,但是不推荐 引用在初始化时引用一个对象后,就不能再引用其他对象,而指针可以改变指向对象 引用可以直接访问指向对象,指针需要解引用才能访问对象 sizeof
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处...4 相关面试题:为什么要进行内存对齐?...this指针的类型:类类型* const 只能在“成员函数”的内部使用 this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参...可以为空,当我们在调用函数的时候,如果函数内部并不需要使用到this,也就是不需要通过this指向当前对象并对其进行操作时才可以为空(当我们在其中什么都不放或者在里面随便打印一个符串),如果调用的函数需要指向当前对象...会在调用Print成员函数时崩溃,因为此时的this是空指针,当使用成员函数操作对象成员变量时,需要对指针进行解引用操作,而对空指针解引用操作会崩溃 觉得不错的话,欢迎多多点赞三连支持博主!!
什么是指针 指针是一个特殊的变量,它存储了另一个变量的内存地址。指针的作用是让程序员能够直接操作内存,在进行大规模数据操作时,指针能够大大提高程序的效率。...指针类型的实际意义 指针类型决定了当我们使用解引用操作时,如何访问内存中的数据。例如,如果我们用一个char*类型的指针去访问int类型的数据,可能会导致程序崩溃或不正确的结果。...指针解引用的影响 当我们解引用指针时,C语言会根据指针的类型来决定如何解析内存。具体来说,指针类型决定了解引用时的“步长”,即它访问内存的单位大小。...此外,指针在函数传参时尤其有用,因为它允许我们传递大型数据结构(如数组或结构体)而不必复制数据。 3. 指针与结构体 指针可以指向结构体,并使我们能够直接操作结构体的内容。...Student,并使用指针p来访问结构体中的成员变量。
通过显式类型转换,程序员可以对这种情况进行评估和处理,确保程序的行为符合预期。同时,在涉及到不同类型的指针、引用以及复杂的数据结构时,显式类型转换也是处理类型兼容性问题的重要手段。...当进行向上转型时,即将派生类指针或引用转换为基类指针或引用,静态_cast是安全的,因为它遵循了 C++的类型层次规则。...与静态_cast不同,动态_cast在运行时会进行类型检查。当我们将一个基类指针或引用转换为派生类指针或引用时,它会检查对象的实际类型。...当我们从一个存储 Shape 指针的容器中取出指针并希望将其转换为具体的派生类指针以调用特定的绘制方法时,动态_cast可以确保转换的安全性,避免在对象类型不匹配时出现错误。...例如,当我们有一个 const 引用指向一个对象,但在某个特定的函数内部,我们知道这个函数不会修改对象的值,但需要将其传递给一个非 const 版本的函数时,可以使用 const_cast。
当你在代码中又定义了一个名为rand的全局变量时,就产生了命名冲突。编译器会分不清你这里的rand到底是要表示你自定义的那个整型变量,还是要调用标准库中的rand函数,所以会报错。...,其他变量的值也会随之改变 8.3、引用的使用 8.3.1、引用作为函数参数 传递引用可以避免复制开销,当函数的参数是比较大的对象(如结构体、类对象,后面我们会讲到C++的类和对象)时,使用引用传递可以避免对象的复制...当我们不希望在函数内部修改引用所指向的对象时,可以使用const引用。这样可以提高程序的安全性和可读性。...8.5.2、初始化要求 指针:指针可以先定义后初始化,也可以在定义时初始化,指针还可以初始化为nullptr(在 C++ 11 及以后),表示不指向任何有效地址 引用:引用在定义时必须初始化,而且一旦初始化就不能再引用其他变量...nullptr是 C++ 11 引入的一个关键字,用于表示空指针。它是一个特殊的字面值,专门用于初始化指针,表示指针不指向任何有效的对象或函数 它可以转换成任意其他类型的指针类型。
命名空间域,与全局进行隔离 编译时想要使用变量/函数/结构体/……编译时向上查找过程必须包含对应的代码,先局部查找,然后全局查找。...引用在定义时必须初始化 一个变量可以有多个引用(上面提过例子) 引用一旦引用一个实体,就不能引用其它实体,这里使用ra对变量a引用之后,还使用b进行引用,编译代码时没有报错,但运行后会报错...例如if语句调用加分号的ADD函数 // 为什么要加外⾯的括号,为什么要加⾥⾯的括号? C语言debug版本默认不展开inline。debug版本想要展开需要设置这两点。...,nullptr是一种特殊类型的字面常量,它可以转换为其它类型的指针类型。...使用nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,而不能被转换为整数类型。 使用nullptr就可以避免上述情况出现的问题
这是因为 当我们进行赋值,或者进行隐式类型转换的时候,这里会产生一个临时变量,而临时变量具有常性 是不可进行,改变和隐式类型转换的 这是我们对其 临时变量的常性,进行权限的平移就会进行报错了 int main...下面看一下这段代码,这里我们进行判断比较时是不会进行提升? 那么这里是对变量本身进行提升吗?...,我们吧函数 fun 里面本来要销毁的变量给使用别名返回了。...但是这个快空间本来是要还给操作系统的: 这样我们就造成了内存泄漏 当我们在进行调用函数时会对上一个销毁的函数空间进行复用,所以就把原来的空间a给改变了 所以使用引用做返回值的时候一定是对在堆上开辟...引用必须初始化才能使用,指针可以初始化也可以不初始化 引用不可以改变指向,但指针可以改变指向 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32 位平台下占
,当我们使用普通指针或引用指向常量数据时,会引发错误 int main() { const int a = 10; //此时a为常变量,具有常量属性 const int* pa = &a;...,需要小结一下: 引用在概念上是给变量取别名,而指针是新开一块空间指向变量 引用必须初始化,指针可以不初始化 引用无法改变指向,指针可以 不存在空引用,但存在空指针 引用大小为所代表变量的大小,而指针大小为...4/8 字节 引用+1等价于变量+1,指针+1则表示指向位置向后偏移一个单位 引用不需要解引用,指针使用前需要解引用 引用使用起来更安全、更方便 以后涉及需要改变原变量值时,优先考虑使用引用,特殊场景下...auto 支持一行声明多个变量,当然类型得统一 auto a = 1, b = 2, c = 3; //合法,类型统一 auto a = 1, b = 2.2; //非法,类型不统一 注意: auto..."; } cout << endl; return 0; } 注意: 范围 for 遍历数组时,数组大小必须确定,迭代的对象要实现 ++ 和 == 的操作 ---- nullptr指针空值 这个是
,指针可以不初始化 引用不能改变指向,指针可以 引用相对更安全,没有空引用,但是有空指针 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)...*p = &a; auto& r = a; 它的推导是十分灵活的 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加& 比如我们想创建一个函数指针...因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导...这个变量的类型应该与 range 中的元素类型相兼容。...0 可能引起的一些类型混淆或过载解析问题,nullptr 可用于任何需要空指针的地方,与所有指针类型兼容,包括 C++ 基本类型指针、对象指针、函数指针以及成员函数指针 由于 nullptr 有自己的类型
类型转换 一、C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换...,类似于宏一样,当我们需要打印数据时,就直接用初始数据替代我们的 const 变量;所以当我们内存中的数据被修改了,但是编译器没有去内存中去取数据,所以 a 的值没有受影响。...4. dynamic_cast dynamic_cast 用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换),这个是C语言不具备的。...向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则) 怎么理解向上转换呢?...向下转型:父类对象指针/引用->子类指针/引用(用 dynamic_cast 转型是安全的) 向下转换的规则:父类对象不能转换成子类对象,但是父类指针和引用可以转换成子类指针和引用。
和 struct 区别 解答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。...计算时 要考虑 默认对齐。...结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。 4....当我们在调用函数的时候,如果函数内部不需要通过this指向当前对象并对其进行操作时才可以为空(当我们在其中什么都不放或者在里面随便打印一个字符串);如果调用的函数需要指向当前对象,并进行操作,则会发生错误...(空指针引用) 8.3 this指针的用法 保证每个对象拥有自己的数据成员,但共享处理这些数据的代码 (基类成员的访问和this无关) 1、访问成员变量 2、访问成员函数 在成员函数内部,可以通过this
引用& 首先,&不是地址运算符,而是类型标识符的一种,就像*也不是指针运算符一样。 本篇偏向于&运算符。...引用经常被用作函数参数,使得函数中的变量名成为调用程序中变量的别名。这种调用方法我一直搞得晕晕的,正好这次一次性根除。这种传递参数的方法称为按引用传递。...//如果理解不了,这样理解:参数中的*和&只是走个过场,告诉人家那个参数是什么类型的 //调用函数时的参数是a,不是*a,也不是&a //所以&a传的这个a是一个int类型,而*a的这个a就是指针...将引用参数声明为const数据的好处有这些: 防止无意中被修改。 使用const参数可以兼容非const传参。 将引用用于结构 C++引入引用主要就是为了和结构和类。...返回引用时最重要的一点是:应避免返回函数终止时将不再存在的内存单元的引用。
领取专属 10元无门槛券
手把手带您无忧上云