您的位置:首页 > 编程语言 > C语言/C++

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;
}

此处应该有掌声~!!!


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: