伪军迷祝:建军节快乐! 当调用一个函数时,实际上入参使用的都是副本(除非是引用),指针也不例外。举个例子如:void func(int a, int * p);当调用func时无论是a还是p其实传入的都是副本,假设调用func时传给p的值是pt,则p这个pt的副本保存着和pt一样的地址,*p和*pt都是同一地址上的值,改变*p也就改变了*pt。但是,对p本身的操作是不会影响pt的,例如不能在函数func内部给p动态分配内存,或者使p指向别的地方,因为这只是对p这...
C++ 98的 std::auto_ptr已经被彻底遗弃了,取而代之的是unique_ptr、shared_ptr与weak_ptr。大部分时候我们自己手动申请内存方式内存都是没有问题的,问题是如果程序很大了之后,一个复杂的对象,多次拷贝的代价非常高,很多地方都会使用到,只存在一份拷贝显然是最好的,这个时候对象生命周期的管理就会很复杂,所以c++引入了智能指针。 任何事物都会有两面性。 Shared_ptr摘录于Effective C++, 3rd Edition, Item 17: 在 standal...
一、 二维数组1> 初始化int a[3][3] = { {1,0,0}, {0,1,0}, {0,0,1} }; // 这里是 {} , 而不是()2> 将二维数组当做一维数组处理void print_array( int * p, int row, int line){ for(int i=0; i<row; ++i) { for(int j=0; j<line; ++j) { printf("%d \n", *( p + i * row + j ) ); // 相当于 *( *(p+i) + j ); // p[i][j] } }}// 调用print_array( (int *)a, 3, 3 );3> 二维数组当二维数...
【送给在路上的程序员】对于一个开发者而言,能够胜任系统中任意一个模块的开发是其核心价值的体现。对于一个架构师而言,掌握各种语言的优势并可以运用到系统中,由此简化系统的开发,是其架构生涯的第一步。对于一个开发团队而言,能在短期内开发出用户满意的软件系统是起核心竞争力的体现。每一个程序员都不能固步自封,要多接触新的行业,新的技术领域,突破自我。数组与指针#include<stdio.h> #include<stdlib.h>void main1()...
左值和右值的区别:左值就是在赋值中可以放在赋值操作符两边的值,比如: int a = 1; double b = 2.0 a = b; b = a; 这里a和b都是左值,一切变量都是左值,但const量是例外。 而右值则是只可以放在赋值操作符右边的值,比如: int a = 0; char *b = "hello"; 3 = a; // ERROR "howdy" = b // ERROR 这里3和"howdy"都是右值,所以不能放在赋值操作符左边,一切常数、字符和字符串都是右值。指针变量的声明与初始化1.指针包含的是包含...
1. 传统指针存在的问题传统指针存在诸多的问题,比如指针所指向的对象的生命周期问题,挂起引用(dangling references),以及内存泄露(memory leaks). 如下是一个传统指针的使用过程void Foo() {int *iPtr = new int[5];// manipulate the memory block// ...// ...// ...delete[] iPtr; }以上代码将正常运行且内存将被合理释放,但是使用指针常会发生一些意想不到的事情,比如访问一个非法的内存单元,除0操作,以及根据一些判断条...
参数传递的本质是什么?参数的传递本质上是一次赋值的过程,赋值 <---> 对内存进行拷贝 <---> 将一块内存上的数据复制到另一块内存上C++禁止在函数调用时直接传递数组的内容,而是强制传递数组指针,而对于结构体和对象没有这种限制。引用是什么?引用可以看作是数据的一个别名,同个这个别名和原来的名字都能找到这份数据。引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其他数据,这有点类似于const变量(常量)...
二级指针第一种内存模型(指针数组)指针的输入特性:在主调函数里面分配内存,在被调用函数里面使用指针的输出特性:在被调用函数里面分配内存,主要是把运算结果甩出来 指针数组 在C语言和C++语言中,数组元素全为指针的数组称为指针数组。一维指针数组的定义形式为:“类型名 *数组标识符[数组长度]”。 例如,一个一维指针数组的定义:int *ptr_array[10]。 如何理解指针数组 指针数组是数组元素为指针的数组,其...
这一点与指向成员的指针类似,其实现可能更加复杂,因为成员函数同时还存在虚拟函数,需要动态绑定执行动作。当然这种属性是属于函数本身的,此处表达的是指针不涉及函数的属性问题。 1: class shape 2: { 3: public: 4: // void moveTo(point newLocation); 5: bool validate(); 6: //… 7: } 8: 9: class circle:: public shape 10: { 11: public: 12: //… 13: bool draw() const; 14: ...
大多数C++类用三种方法之一管理指针成员(1)不管指针成员。复制时只复制指针,不复制指针指向的对象。当其中一个指针把其指向的对象的空间释放后,其它指针都成了悬浮指针。这是一种极端(2)当复制的时候,即复制指针,也复制指针指向的对象。这样可能造成空间的浪费。因为指针指向的对象的复制不一定是必要的。(3) 第三种就是一种折中的方式。利用一个辅助类来管理指针的复制。原来的类中有一个指针指向辅助类,辅助类的数据成...
#include <iostream> #include <memory> #include <cassert> /*//this //调用了两次析构函数,ParentPtr p(this);//智能指针出了作用域后就delete this ,析构了//所以错了,为了解决这个问题,就需要自身的类继承于 std::enable_shared_from_this<Type>//将ParentPtr p(this) 换成, shared_from_this();*/ class Parent; typedef std::shared_ptr<Parent> ParentPtr; typedef std::weak_ptr<Parent> WeakParentPtr;class Child : pub...
引用包装器 std::ref(变量)#include<iostream>template<class T> void com(T arg)//模板函数,引用无效,引用包装器 {std::cout <<"com ="<< &arg << "\n";arg++; }void main() {int count = 10;int & rcount = count;com(count);std::cout << count << std::endl;//std::ref(变量) ,函数模板,引用包装器//com(std::ref(count));com(rcount);std::cout << "main=" << &rcount << "\n";std::cout << count << std::endl;std::cin...
小猪猪逆袭成博士之C++基础篇(四)关键词:数组,Vector。 一、数组与指针数组相信大家学过C语言或者其他的语言都不陌生,简单的就是同一个变量类型的一组数据。例如:int a[10],意思就是从a开始有10个连续的int大小的空间。我们还是从初始化说起。我们以数据类型int为例,当然也可由有很多的数据类型,可以是像int,double这种,也可以是自定义的类,一般的初始化方法有:int a[10];int a[10]={0};int a[3]={0,1,2};在前面的文章...
c++智能指针介绍由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见,并造成内存泄露。如此c++引入智能指针 ,智能指针即是C++ RAII的一种应用,可用于动态资源管理,资源即对象的管理策略。智能指针在 <memory> 标头文件的 std 命名空间中定义。 它们对 RAII 或获取资源即初始化编程惯用法至关重要。RAI...
#include <iostream> #include <string> #include <memory> class Item { public:Item(std::string str):name(str){}~Item(){std::cout<< name << " unitialize!" <<std::endl;}void dump(){std::cout<< "I‘am " << name <<std::endl;}static Item *CreateItem(std::string str){Item *pItem = new Item(str);return pItem;} private:std::string name; };int main() {Item *pi = Item::CreateItem("common ptr");pi->dump();dele...