c++入门教程(十五)

来源:互联网 发布:php compact 编辑:程序博客网 时间:2024/05/29 18:48

好久没敲黑板了  前方高能预警:今天的内容可能有些绕,但是,蛮有用的。至少,好玩。

前面我们说过,声明一个变量,相当于在内存中要了一块空间。不同类型的变量要的空间的大小是不一样的。既然有了空间,那么,它就有个开始的位置(比如学校就有门牌号)。我们用符号  '&' 来获取一个变量的地址。用法如下  &要获取首地址的变量名。例如

int b;&b;
这样子我们就拿到了变量b代表的空间的起始地址(首地址)了。
然后我们用一种新的类型的变量来存放这个  “位置”    这个新的猥琐的类型叫做指针类型,记作  *   (这里的*不是乘号的意思)。具体用法和其它类型一样     *   变量名    例如    

* a;

 现在,我们拿到了这块空间的的首地址,但是,想要根据空间的地址拿到这块空间里的东西还需要知道这块空间的大小(也就是这块空间放的是哪种变量)。


所以,声明一个完整的指针类型的方式  类似     要通过地址获取的空间的类型   *    指针变量名;    例如:

int b = 0;int * p;p = &b;
注意: 上面的要通过地址获取的空间的类型可以int,char 这种基本数据类型,也可以是自己使用struct定义的自定义类型。例如:

#include<iostream>using namespace std;struct student{int age;char sex;};int main(){student stu1;student * stupointer = &stu1;return 0;}

现在,我们拿到了一个变脸个的首地址了,也知道这货有多大了,于是,我们要通过这个纪录了其它变量首地址的变量去获取这块空间里的内容了(这里开始绕了)

通过一个指针类型的变量拿到 对应空间里的内容的语法如下    *指针类型变量       (注意,这里的* 和上面那个用来声明指针类型变量的*是不一样的。这里的* 是用来通过地址取对应数据的)  然后,这个时候     *指针类型变量    的用法就和它所指向的类型的变量的用法是相同的了。

于是,我们先来一个简单的例子

#include<iostream>using namespace std;int main(){int a = 30;int * b = &a;cout<<"a = "<<a<<endl;cout<<"*b = "<<*b<<endl;return 0;}
结果如下

我们不仅能通过指针变量得到空间里的值,还可以通过指针变量修改空间里的值

#include<iostream>using namespace std;int main(){int a = 30;int * b = &a;cout<<"修改前:"<<endl;cout<<"a = "<<a<<endl;cout<<"*b = "<<*b<<endl<<endl<<endl<<endl;*b = 66;cout<<"修改后:"<<endl;cout<<"a = "<<a<<endl;cout<<"*b = "<<*b<<endl;return 0;}
结果如下

现在来试试用指针来操作自定义类型的变量

#include<iostream>using namespace std;struct student{int age;char sex;};int main(){student stu1;student * stupointer = &stu1;(*stupointer).age = 3;cout<<"stu.age = "<<stu1.age<<endl;cout<<"(*stupointer).age = "<<(*stupointer).age<<endl;//下面是简便的用法 指向结构体变量的 指针类型变量-〉xxxx 获取它指向的变量的xxxx属性//例如stu1.age  等同于   (*stupointer).age   等同于    stupointer->agestupointer->age = 6;cout<<"stu.age = "<<stu1.age<<endl;cout<<"(*stupointer).age = "<<(*stupointer).age<<endl;cout<<"stupointer->age = "<<stupointer->age<<endl;return 0;}

结果如下





原创粉丝点击