函数的return语句写错了,注意不要返回指向“栈内存”的“指针”或者“引用”,因为该内存在函数体结束时被自动销毁。 (3). 使用free或delete释放了内存后,没有将指针设置为NULL。...str << endl; } 用调试器逐步跟踪Test4,发现执行str = GetString语句后str不再是NULL指针,但是str的内容不是“hello world”而是垃圾。...杜绝“野指针” “野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。...所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。...对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数,那么new的语句也可以有多种形式。
一 指针和数组对比 C++/C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。...人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。 “野指针”的成因主要有三种: (1)指针变量没有被初始化。...对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。...因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。...(1)判断指针是否为NULL,如果是则马上用return语句终止本函数。 (2)判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行。
4,一行代码只做一件事情,如只定义一个变量,或只写一条语句。 5,尽可能在定义变量的同时初始化该变量。...,以防止该指针在函数体内被意外修改。...(2)free或delete释放了内存之后,没有将指针设置为NULL,导致产生了 野指针 8.2.3.指针与数组对比 数组要么在静态存储区被创建,如全局数组,要么在栈上被创建。...,成为野指针的原因有: 1,指针变量没有被初始化 指针变量在创建的同时应当被初始化,要么将指针设置为 NULL,要么让它指向合法的内存。...NULL,不能 return other,因为可能other是个临时对象,在赋值结束后它马上消失,那么return other返回的将是垃圾。
; printf("%p %p %p\n", &a, &ra, &rra); } 引用有以下几个特点: 引用必须在定义时进行初始化,一旦初始化完成后,就无法更改引用的绑定。...在main函数中,将变量x传递给increment函数后,x的值被递增为11。因为参数是引用类型,所以对i的修改会直接影响到x。...因此,在执行类型转换时,会创建一个新的变量来存储转换后的值,并且可以在需要的地方使用。...为什么?...引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 在sizeof
然后,使用swapr函数通过引用来交换wallet1和wallet2的值,并使用cout语句输出交换后的值。...接着,使用swapp函数通过指针来交换wallet1和wallet2的值,并再次使用cout语句输出交换后的值。...最后,使用swapv函数通过传值来交换wallet1和wallet2的值,并再次使用cout语句输出交换后的值。...然后,使用swapr函数通过引用来交换wallet1和wallet2的值,并使用cout语句输出交换后的值。...接着,使用swapp函数通过指针来交换wallet1和wallet2的值,并再次使用cout语句输出交换后的值。
引用经常作为函数的参数传递,可以与值传递,以及指针传递做个比较: 值传递: 实参初始化形参时要分配空间, 将实参内容拷贝到形参 引用传递: 实参初始化形参时不分配空间 指针传递:本质是值传递,但如果我们要修改指针本身...,那只能使用指针的指针了,即 **, 或者指针引用 *& 而且使用指针比较不保险的是很多人会忘记加上const的限制,即很可能接下来的程序中你又把这个指针指向了其他的变量,这样就混乱了。...n2=11 n=7 好像没错是吧,再试试,我们在最后加一条语句再打印一下 n2 cout<<"n2="<<n2<<endl; n2=11 n=7 n2=1474313670 奇怪了,<em>为什么</em>这次打印变成这么大的数而我们完全没更改...其实函数返回的是局部变量sum的引用,而 n2 本身又是引用,即引用着原来sum 拥有的那块区域,第一次打印没有出错是因为本来写在sum 区域上的值11 尚未被覆盖,而再运行两条打印<em>语句</em><em>后</em>再次打印,很可能原来属于...大家要比较清晰的是,局部变量<em>在</em>函数栈上释放,但本来区域的值第一时间还是原来的值,但经过程序运行,堆栈内存区域重用, 一般就被覆盖了。
其实想要搞明白为什么会出现这种状况,首先要明白的是C++是祖师爷用C语言的过程中,饱受C语言中一些限制的诟病,在C语言的基础上增加的一个更牛的系统。...2、命名空间 为什么要有命名空间的这一术语?因为在C/C++中,变量,函数以及类都是大量存在的,这些都将存储于全局作用域,那么就可能会引起冲突。...10; // C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决 int main() { printf("%d\n", rand); return 0; } // 编译后后报错...引用和指针的不同点: 1、引用概念上的定义是变量的别名,指针存储一个变量的地址。 2、引用在定义的时候就必须初始化,指针没有要求。...3、引用在初始化时引用一个实体之后,就不能引用其他实体,而指针可以在任何时候指向任何一个同类型的实体。 4、没有NULL引用,但是有NULL指针。
为什么?...引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 在sizeof中含义不同:引用结果为引用类型的大小...引用比指针使用起来相对更安全 语法上区别 引用是别名,不开空间;指针是地址,需要开辟空间存地址 引用必须初始化,指针无要求 引用不能改变指向,指针可以 引用相对更安全,没有空引用,但是有空指针;容易出现野指针...,但是不容易出现野引用 底层区别 汇编层面上,没有引用,都是指针,引用编译后也转换成指针了 3....采用C语言编译器编译后结果 结论:在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变 采用C++编译器编译后结果 结论:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中
千万别问我为什么输出的不是1000。图片只是一个演示。 有了这个地址后,可以通过这个地址访问num变量中的数据。...std::cout<<*num_p; //输出:20 需要注意:在声明和通过地址访问数据时,都要使用 *符号: 声明时*表示指针类型。...几个问题 3.1 为什么要使用指针变量 在使用指针变量时,总会有一个疑问,既然能够使用变量名访问变量,为什么还要搞一个指针变量。指针变量不仅要占用内存空间,且语法繁琐,是不是有点啰嗦了。...如果把这指针变量用于代码逻辑,会产生无中生有的数据,显然是违背数据的准确性和可靠性。 所以,在声明指针变量后,一定要对其进行初始化。...<<score<<std::endl; std::cout<<*p<<std::endl; //输出 56 56 可以认为指针访问是变量名访问的另一种形式,所以在初始化指针变量时, 需要使用 &或 new
下面调试运行: 在cout语句行加断点,调试运行,同时打开电脑的任务管理器,运行程序后,可以在任务管理器中看到内存的占用突然增大(malloc的作用)而后回到正常(free的作用)。...而如果将free语句注释掉,再次调试运行至cout语句处,在任务管理器可以看到内存始终占用较多。如果此时在cout语句后还要大量代码需要分配内存,可能就会内存分配失败造成程序异常。...注意,野指针不是NULL指针, 它比NULL指针更容易犯错,因为它不能通过形如 if (NULL == p)的判断语句来预防,只能我们自己在写代码时多注意。...指针定义后未初始化 指针定义后,在使用前,需要初始化,否则也是野指针,指向不确定: #include using namespace std; int main(void) {...建议:定义指针变量的时候尽量初始化,哪怕初始化为NULL也好 不应返回局部变量的地址 c/c++中,局部变量是存放在栈中的,它的特点是随函数调用时创建随函数结束时销毁,因此在程序中将局部变量的地址返回后赋值给一个指针
,为什么?...,为什么?...后者表示指针p本身的值不可修改,一旦p指向某个整型变量之后就不能指向其他的变量,即p是个指针常量。 (5)引用本身可以理解为指针常量,在引用前使用const没有意义。...类对象的非静态常量成员必须在构造函数中初始化,且只能借助于初始化列表,因为初始化列表才是初始化,构造函数中通过赋值运算符进行的是赋值,并非初始化。...a@@3HB) 但是将后两个源文件缀名改为.c,采用C语言的编译器编译的话,就可以通过。
在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”?...以下代码中的输出语句输出0吗,为什么?...因为free(str);之后,str成为野指针, if(str != NULL)语句不起作用。 179、请阅读以下一段程序,并给出答案。...执行switch语句时,在进行作为条件的表达式求值后,将从某个匹配的标号位置起向下执行,当碰到下一个标号位置时(停止/不停止)___不停止__执行。 275....以下代码中的输出语句输出0吗,为什么?
为什么?...2.引用在定义时必须初始化,指针没有要求 3.引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 4.没有NULL引用,但有NULL指针 5.在sizeof...(关于迭代器这个问题,以后会讲,现在大家了解一下就可以了) C++98中的指针空值 在良好的C/C++编程习惯中,声明一个变量时最好给该变量-个合适的初始值,否则可能会出现不可预料的错误,比如末初始化的指针...如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化: void Testptr() { int* p1 = NULL; int* p2 = 0; } NULL实际是一个宏, 在传统的...不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如: void f(int) { cout<<"f(int)"<<end1; } void f(int*) { cout<<"f(
指针变量的定义和初始化 2. 指针操作 3. 按引用向函数传递参数 4. const 修饰符 5. sizeof 操作符 6. 指针表达式和指针运算 7. 指针数组 8....指针变量的定义和初始化 与C语言其他变量类似,指针也是一种变量,只不过它与其他变量不同,一般变量是直接包含了一个特定的值,而指针是包含了一个变量的值所在的地址,也就是说,指针存储了一个变量的地址,间接地指向一个值...与一般的变量一样,指针在使用之前也必须定义: int *countPtr; 以上语句定义了一个 int * 类型的变量countPtr,表示countPtr是一个指向int类型变量值的指针。...,不会报错,但第二个count是int类型的变量,可能会导致逻辑错误,必须注意 一个指针必须在定义时或者在赋值语句中初始化,可以初始化成0,NULL或者一个变量的地址。...这是为什么呢?
缺省值必须是常量或者全局变量; C语言不支持(编译器不支持); 上述第二点,为什么只能在函数声明时给缺省值? 因为缺省参数是在调用的阶段使用的。...'c'); cout -> f(int a, char b) //f('c', 10); cout -> f(char a, int b) 2.2 C++支持函数重载的原理 — 名字修饰 问:为什么...采用C++编译器编译后结果 结论:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中。...引用不能完全替代指针原因:引用定义后不能改变指向!...引用和指针的不同点: 引用概念上定义一个变量的别名,指针存储一个变量地址; 引用在定义时必须初始化,指针没有要求; 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
中文版5th中P116的练习题目) 由于编译器初始化时会将这些数组形式的元素转换成指向该数组内首元素的指针,这样得到的row类型就是int*,这样原来的for语句就是在一个int*中遍历,这是不合法的。...4; col++) cout << ia[row][col] << endl; cout << endl; //使用普通for语句,使用指针 int(*...; return 0; } 4.为什么不能通过范围dor语句向vector(或者其他容器)中添加元素 范围for语句的语法形式为 for(declaration:expression)...statement 其中expression必须为一个序列,为什么呢?...因为这个时候对容器的增删操作使得保存在end中的迭代器失效了,不再指向任何元素,或者是尾元素的后一个位置。 5.为什么需要对序列中的元素执行写操作的时候,循环变量必须声明成引用类型?
在一些编译器中static 局部变量并不是线程安全的?有两种方案,加锁和利用类内static对象在main函数之前初始化来保证线程安全。...其他一些基本知识点: static局部静态变量,是在程序执行到语句的时候才进行初始化,且只初始化一次。 类内的static变量,初始化是在外部进行的。且在main函数之前进行初始化。...下面依次来介绍: 饿汉模式 饿汉模式是指,无论是否使用,程序启动后,就会把单例实例化出来。...懒汉模式 懒汉模式,是指在使用到时,才去初始化,没有用到就不处理。有两种方法。指针版和局部static变量版。 下面先看一下指针版的懒汉模式。...这种方法,获取单例后都要加一句释放语句,写代码中很容易遗忘,且看起来不是那么优雅。怎么避免这个主动释放呢?
为什么?...引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 在sizeof中含义不同:引用结果为引用类型的大小...3.2 auto简介 在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的 是一直没有人去使用它,大家可思考下为什么?...,否则可能会出现 不可预料的错误,比如未初始化的指针。...不论采取何 种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如: void f(int i) { cout << "f(int)" << endl; } void f(int* p) {
该条语句编译时会出错,定义时没有初始化 int& ra = a; int& rra = a; printf("%p %p %p\n", &a, &ra, &rra); } 3.常引用 常引用声明方式...引用使用时无需解引用(*),指针需要解引用; 3. 引用只能在定义时被初始化一次,之后不可变;指针可变; 4. 引用没有 const,指针有 const; 5....f@@YAXH@Z),该符号在函数 _main 中被引用 8auto关键字 auto是一个C/C++语言存储类型,仅在语句块内部使用,初始化可为任何表达式,其特点是当执行流程进入该语句块的时候初始化可为任何表达式...10指针空值nullptr nullptr:是C++空指针类型的关键字,nullptr是在C++11中引入的。...在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
以下这种方式的重载是错误的,这要跟C++的编译后的函数名扯上关系了。...2、纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0" 3、声明了纯虚函数的类是一个抽象类。...vptr是一个指针,在类的构造函数中创建生成,并且只能用this指针来访问它,因为它是类的一个成员,并且vptr指向保存虚函数地址的vtable.对于静态成员函数,它没有this指针,所以无法访问vptr...---- Q8:基类的虚函数表存放在内存的什么区,虚表指针vptr的初始化时间?...多态的函数调用语句被编译成根据基类指针所指向的(或基类引用所引用的)对象中存放的虚函数表的地址,在虚函数表中查找虚函数地址,并调用虚函数的一系列指令。
领取专属 10元无门槛券
手把手带您无忧上云