c++数组,引用和指针
2015-03-18 14:26
239 查看
引用数组和指针这一章学完,难啊...
绕头的东西,学了半年都用的不熟练.一: 符号 " &"
1.用在类型和名字中间,为引用.比如:int a = 1;
int& b = a;
a.引用必须初始化,指向的对象初始后不能再指向别的对象.
b.改变实参,要传引用,因为函数return只能返回一个值,但是我有2个,甚至更多的值要返回呢?例如
bool Add(int& a, int& b,int& sum)
{
a+=3;b-+2; //会改变传进来的实参 a和b,因为是 引用&
sum = a+b;
return true;
}
2.直接在名字前加,为取地址,例如:
int a = 1;
int* b = &a;
3.作为操作符,按位与,例如:
int flag = 1;
if((flag & 1) == true){ //... }
二.指针
1. int* a,b; //等价于 int * a; int b;int* a,* b; //才是定义两个指向int 的指针
2. 指针进行初始化和赋值只能是下列四种类型
a.0值常量表达式(const int a = 0; int* sp = a(或者直接 int* sp = 0/Null))
b. 类型匹配的对象地址
c.另一对象之后的下一个地址
d.同类型的另一个有效指针
例如:
int a = 0;
const int ca = 0;
// int* b = a; //错误
//int* b2 = ca;//正确
c++从c语言继承下来的Null,等效于 0 , int* b3 = NULL; //正确
3.const 指针要初始化
注意:const int* a 和 int const* a 和int* const a 和const int* const a 的区别!!!
解: const int* a 和 int const* a 是双胞胎,本质一模一样, 可改变指针(a能变), 不能改变所指的对象(*a不能变)int* const a 指针不可改变(a不能变),但能改变a所指向的对象(*a能变)
const int* const a 既不能改变指针(a不能变),也不能改变指针所指向的对象(*a 也不能变)
三.数组
形如 int arr[10];注意:数组的三个重要限制:
a. 数组长度固定不变,(不能动态加长,只能创建一个更大的数组,然后一个个复制进去)
b. 在编译的时候必须要直到长度,(int arr[x.getsize()] //错误!!!,getsize只能在程序运行时才知道长度,但是它编译的时候就要知道.)
c. 数组只能在它语句块内存在(出了作用域就不可用了.)
现在,才是重头戏:
问题1.创建动态数组:int num;
cin >> num;//输入数组个数
int* arr = new arr[num]; //直到delete才会消失
.....
delete [ ] arr; //new出来的东西都要delete,注意别忘记 空 [ ],否则错误很严重
指针就 new delete ,难就难在不知道什么时候delete!!!
问题2. 多维数组.一定程度上,数组就是指针,指针就是数组.
int* a[4] 和 int (*a) [4] 分别代表了什么意思 ,有什么区别?
解: int* a[4] 是 4个指向 int 类型的指针.
int (*a)[4] ,我们不妨 就把 *a 看成是A, 即 int A[4] 表示四个int类型元素的数组 a就是指向A的指针
换句话说相当于: int arr[4]; int* sp = arr; 指针指向arr,看出来没?
解决一个很严重的问题.(关于内存释放的问题!!!)
我在一个函数里,new了一个指针,但是,该函数里分支结构假如很多很多很多.....假设一万个吧.每个return 之前,都要delete来释放内存,但是我有一万处returned,难道真的要delete一万次吗......
解决方法:
template<typename T> class AutoRelease { public: AutoRelease(T* sp) { m_SP = sp; } ~AutoRelease() { //对象除了作用域或者删除后,自动调用该对象的析构函数 if (m_SP != nullptr) { delete m_SP; } } private: T* m_SP; }; int _tmain(int argc, _TCHAR* argv[]) { int* sp = new int(); AutoRelease<int> atr(sp); //此时,无限多的分支,无限多的return的时候,不用手动delete sp了 //atr对象出了作用域,自动调用其西沟函数,自动释放sp了, //哈哈哈... return 0; }
此处应该有掌声~!!!
相关文章推荐
- 浅析c++数组的引用与指针
- 第十二章 Perl5中的引用/指针
- C++学习笔记(1)之传值、传指针、传引用的区别
- 第七章、函数形参(指针与引用以及传递给函数的数组、vector的操作)
- C++ 引用和指针的区别 常量指针和指针常量的区别
- 引用与指针
- 函数指针和函数引用的使用
- C++-指针和引用的区别
- 浅谈C++中指针和引用的区别
- c++引用与指针的区别(着重理解)
- 指针和引用的比较
- c++按地址传参–指针和引用
- 实验2 C++数组与指针
- 【C++与C差异】引用与指针
- C和C++中const的区别,引用,一级指针和const组合
- nim的引用和指针
- 指针和引用对比
- 指针与引用
- C++中引用和指针的区别
- C++中值传递、指针传递、引用传递的总结