C++变量与指针

来源:互联网 发布:互联网软件与服务 编辑:程序博客网 时间:2024/06/01 08:03

http://c.biancheng.net/cpp/biancheng/view/160.html

指针变量是一种特殊的变量,它和以前学过的其他类型的变量的不同之处是:用它来指向另一个变量为了表示指针变量和它所指向的变量之间的联系,在C++中用“*”符号表示指向 或表示取值,例如,i_pointer是一个指针变量,而*i_pointer表示i_pointer所指向的变量,见图6.3。


下面两个语句作用相同:
    i=3;
    *i_pointer=3;


图 6.3

定义指针变量

C++规定所有变量在使用前必须先定义,即指定其类型。在编译时按变量类型分配存储空间。对指针变量必须将它定义为指针类型。先看一个具体例子:
    int i, j;                           //定义整型变量i,j
    int *pointer_1, *pointer_2;       //定义指针变量*pointer_1,*pointer_2
第2行开头的int是指:所定义的指针变量是指向整型数据的指针变量。也就是说,指针变量pointer_1和pointer_2只能用来指向整型数据(例如i和j),而不能指向浮点型变量a和b。这个int就是指针变量的基类型。指针变量的基类型用来指定该指针变量可以指向的变量的类型。

定义指针变量的一般形式为:
   基类型 *指针变量名;
下面都是合法的定义:
    float *pointer_3;  // pointer_3是指向单精度型数据的指针变量
    char *pointer_4;  // pointer_4是指向字符型数据的指针变量
请注意:指针变量名是pointer_3和pointer_4,而不是*pointer_3和*pointer_4,即“*”不是指针变量名的一部分,在定义变量时在变量名前加一个“*”表示该变量是指针变量。

那么,怎样使一个指针变量指向另一个变量呢?只需要把被指向的变量的地址赋给指针变量即可。例如:
    pointer_1=&i;  //将变量i的地址存放到指针变量pointer_1中
    pointer_2=&j;  //将变量j的地址存放到指针变量pointer_2中
这样,pointer_1就指向了变量i,pointer_2就指向了变量j。见图6.4。


图6.4

一般的C++编译系统为每一个指针变量分配4个字节的存储单元,用来存放变量的地址。

在定义指针变量时要注意:不能用一个整数给一个指针变量赋初值,在定义指针变量时必须指定基类型

引用指针变量

有两个与指针变量有关的运算符:
  • &取地址运算符
  •  *指针运算符(或称间接访问运算符)。

例如:&a为变量a的地址,*p为指针变量p所指向的存储单元

【例6.1】通过指针变量访问整型变量。
  1. #include <iostream>
  2. using namespace std;
  3. int main( )
  4. {
  5. int a,b; //定义整型变量a,b
  6. int *pointer_1,*pointer_2; //定义指针变量*pointer_1,*pointer_2
  7. a=100;b=10; //对a,b赋值
  8. pointer_1=&a; //把变量a的地址赋给pointer_1
  9. pointer_2=&b; //把变量a的地址赋给pointer_2
  10. cout<<a<<" "<<b<<endl; //输出a和b的值
  11. cout<<*pointer_1<<" "<<*pointer_2<<endl; //输出*pointer_1和*pointer_2的值
  12. return 0;
  13. }
运行结果为:
100 10    (a和b的值)
100 10    (*pointer_1和*pointer_2的值)

请对照图6.5分析。

图6.5

下面对“&”和“*”运算符再做些说明:
1) 如果已执行了“pointer_1=&a;”语句,请问&*pointer_1的含义是什么?“&”和“*”两个运算符的优先级别相同,但按自右至左方向结合,因此先进行*pointer_1的运算,它就是变量a,再执行&运算。因此,&*pointer_1与&a相同,即变量a的地址

如果有pointer_2=&*pointer_1;它的作用是将&a(a的地址)赋给pointer_2,如果pointer_2原来指向b,经过重新赋值后它已不再指向b了,而也指向了a,见图6.6。图6.6(a)是原来的情况,图6.6(b)是执行上述赋值语句后的情况。


图6.6
2)*&a的含义是什么?先进行&a的运算,得a的地址,再进行*运算,即&a所指向的变量,*&a和*pointer_1的作用是一样的(假设已执行了“pointer_1=&a;”),它们等价于变量a。即*&a与a等价,见图6.7。


图6.7

【例6.2】输入a和b两个整数,按先大后小的顺序输出a和b(用指针变量处理)。

解此题的思路是:设两个指针变量p1和p2,使它们分别指向a和b。使p1指向a和b中的大者,p2指向小者,顺序输出*p1,*p2就实现了按先大后小的顺序输出a和b。按此思路编写程序如下:
  1. #include <iostream>
  2. using namespace std;
  3. int main( )
  4. {
  5. int *p1,*p2,*p,a,b;
  6. cin>>a>>b; //输入两个整数
  7. p1=&a; //使p1指向a
  8. p2=&b; //使p2指向b
  9. if(a<b) //如果a<b就使p1与p2的值交换
  10. {
  11. p=p1;p1=p2;p2=p; //将p1的指向与p2的指向交换
  12. }
  13. cout<<"a="<<a<<" b="<<b<<endl;
  14. cout<<"max="<<*p1<<" min="<<*p2<<endl;
  15. return 0;
  16. }
运行情况如下:
4578↙
a=45 b=78
max=78 min=45

输入a的值45,b的值78,由于a<b,将p1的值和p2的值交换,即将p1的指向与p2的指向交换。交换前的情况见图6.8(a),交换后的情况见图6.8(b)。

图6.8
请注意,这个问题的算法是不交换整型变量的值,而是交换两个指针变量的值。
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 家养的小鸡打架怎么办 小鸡关在一起打架怎么办 小孩感冒出汗多怎么办 宝宝感冒出汗了怎么办 出汗多怎么办%3f 孩子睡觉出汗多怎么办 三年级孩子成绩下滑怎么办 幼儿数学不开窍怎么办 孩子一年级学习跟不上怎么办 孩子学习不认真怎么办 孩子平时不细心怎么办? 脖子出现黑圈怎么办 简历留白太多怎么办 excel数字外面加个圈怎么办 电脑输入法数字数不上怎么办 大班教案迷路了怎么办 迷路了怎么办活动反思 头突然眩晕是怎么办 孩子学习拖拉懒惰怎么办 头发晕想睡觉怎么办 五年级错别字多怎么办 入党志愿书写错字怎么办 高中不会写作文怎么办 考试不会写作文怎么办 高考不会写作文怎么办 孩子总是写错字怎么办 小孩总是写错字怎么办 孩子马虎不认真怎么办 小孩计算老出错怎么办 小学生计算总出错怎么办 高中考试总粗心怎么办 孩子考试总是粗心怎么办 一年级孩子考试粗心怎么办 老师说孩子粗心怎么办 计算题总出错怎么办 计算题总是出错怎么办 数学老是计算错误怎么办? 苗木抵扣计算错误怎么办 表格中计算错误怎么办 孩子电视瘾太大怎么办 孩子考试前失眠怎么办