Xcode学习C++(二、指针和引用)

一:指针部分

指针是一种变量类型,声明指针变量需要分配独立的存储空间,指针可以为空『void』表示不指向任何对象。

指针里存储的值是一个地址,可以通过这个地址获取和改变所存储变量的值。

指针的类型必须与其所指向变量的类型一致,可以在任何时候改变指向的变量……

————————————————————这些是简单理论的啰嗦,下面说些代码相关的————————————————————————————

定义方式:int *p = &a;  *是指针的标识符,表示p是一个指针类型的变量,这里的变量a,必须是一个int类型。 &运算符可以获取变量的地址

取值方式:(可能有点绕)通过指针获取所指向变量的值是这样做的:*p

int a = 10;
    int *pa = &a;
    cout<<a<<"----"<<*pa<<"----"<<&a<<"----"<<pa<<endl;
View Code

输出结果:10----10----0x7fff5fbff89c----0x7fff5fbff89c

可以看到通过*pa获取的值跟a的值一样,a的地址和pa的值也一直,说明指针类型的变量pa的值就是a的地址。

关于指针呢,还有很多东西可以讲,比如指针运算、指向指针的指针、指针方法的指针、指针作为函数参数等等,下次针对指针专门来写写看

二:引用部分

有JAVA或C#等语言基础的人对于引用的认识估计和指针没什么区别,在C++里这两者区别甚大,这也是我学习C++到目前为止跟之前知识体系差距最大的一点。

C++中引用其实就是给变量起一个别名,引用没有自己独立的存储空间,与它引用的变量共享能存,对引用的操作就是对变量的操作(真假美猴王)。

定义方式 int &f = a; &这里又是引用的标识符,f是一个对变量a的引用。f的类型是int那么a的类型也必须是int。

int a = 10;
int &fa = a;
cout<<a<<"----"<<fa<<"----"<<&a<<"----"<<&fa<<endl;
View Code

输出结果:10----10----0x7fff5fbff89c----0x7fff5fbff89c

可以看到引用fa的值和地址与变量a的值和地址一致。

三:引用的使用注意

引用必须在定义的时候就进行初始化。下面的是错误写法:

int &af;

引用一旦在定义的时候确定好引用哪个变量,以后都不能再引用其他变量

int a = 10;

int &af = a;

int b = 20;

af = b;

 最后一行代码af = b;并不代表af引用了变量b,而是将变量b的值赋值给了af引用,也就是将变量b的值给了a

四:const 与 引用

下面的代码效果:不能通过af引用修改变量a的值。称af为const引用

int a = 10;

const int &af = a;

 

下面的代码是不能编译通过的。因为ref引用的类型和变量d的类型不匹配

double d = 1.78;

int &ref = d;

但是将ref改为const引用,就能编译通过

double d = 1.78;

const int &ref = d;

编译能通过的原因是const int &ref = d;等价于下面2句:

int temp = d;

const int &ref = temp;

也就是说ref引用 跟 变量d 并不共享同一块存储空间

五:引用 与 函数参数

 

引用可以作为函数的形参,修改了引用形参,能影响外面实参变量的值

 

如果要在函数内部修改外面实参的值,尽量使用引用作为形参,不要使用指针作为函数形参,原因如下:

 

引用不占用额外的存储空间

 

使用引用修改实参显得更自然、易懂

六:引用 与 函数返回值

 

引用也可以作为函数的返回值,主要目的是:可以将函数调用放在赋值运算符(=)的左边

 

int ages[] = {20, 15, 36, 17, 28};

 

int & ages_index(int i)

 

{

 

    return ages[i];

 

}

 

// 相当于ages[0] = 30;

 

ages_index(0) = 30;

注意:不能返回对局部变量的引用

int & add(int a, int b)

{

    int sum = a + b;

    return sum;

}

 int n = add(10, 20);

int &nf = add(10, 10);

cout << "n = " << n << endl;

cout << "nf = " << nf << endl;

上面的程序会造成nf引用的值是不确定的,并不是20

 

posted @ 2015-03-31 17:13 luseike 阅读(...) 评论(...) 编辑 收藏