首页 > 学院 > 开发设计 > 正文

指针及相关 Part1

2019-11-06 07:51:40
字体:
来源:转载
供稿:网友

C++中用“*”符号表示指向

例如  i_pointer是一个指针变量   而*i_pointer表示i_pointer所指向的变量。

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

对指针变量必须将它定义为指针类型。

int i,j; //定义整型变量i,jint *pointer_1, *pointer_2; //定义指针变量*pointer_1,*pointer_2

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

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

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

(pointer_1 保存a的地址,pointer_2 保存b的地址)

(1) 如果已执行了“pointer_1=&a;”语句,请问&*pointer_1的含义是什么?

*pointer_1 是a,&(a)是取a 的地址,所以&*pointer_1 即变量a 的地址

(2) *&a的含义是什么?

&a 是指取a 的地址,*(&a)= *(pointer_1)意思是取指针变量pointer_1的指向对象,就是a

一共有四个概念,

指针变量, 指针变量保存的地址(指针变量指向的变量的地址),指针变量指向的变量,指针变量指向的变量所保存的值

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

//code 1
int a,b;cin>>a>>b;int *pointer_1,*pointer_2;pointer_1=&a;pointer_2=&b;if (*pointer_1>*pointer_2) cout<<*pointer_1<<*pointer_2;else cout<<*pointer_2<<*pointer_1;

函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送给被调用函数的形参。

//code 2void swap(int *p1, int *p2){int temp;temp=*p1;*p1=*p2;*p2=temp;} p1,p2均为指针变量。这里并没有交换指针的朝向,而是交换了指向的两个变量本身的值调用: swap(pointer_1,pointer_2);  传进去的实参必须是指针变量,*pointer_1 是一般变量不是指针变量//code 3void swap(int *p1, int *p2){int *temp;*temp=*p1;*p1=*p2;*p2=*temp;} 会出错, 因为此时temp是指针变量但并没有让它指向谁,没有分配内存,所以不能用*temp=*p1。

// code 4void swap(int *p1, int *p2){int *temp;temp=p1;p1=p2;p2=temp;} 不会出错,功能是交换两个指针变量所保存的值(指向的变量的地址),不能交换两个一般变量的值。

// code 5void swap(int x,int y){int temp;temp=x;x=y;y=temp;}不用指针变量时,实参传给形参的不是地址而是确切的值例如:int a=3,b=5;swap(a,b); 只会把3和5传入函数, 和变量a,b无关, 所以a,b 的值还是3和5。这是call by value。 而code 2 则真正会改变a b 的值(假设传入了指向a和b的指针变量),称为call by reference。

数组元素的指针就是数组元素的地址。int a[10]; //定义一个整型数组a,它有10个元素 int *p; //定义一个基类型为整型的指针变量p p=&a[0]; //将元素a[0]的地址赋给指针变量p,使p指向a[0] 

 在C++中,数组名代表数组中第一个元素(即序号为0的元素)的地址。(不是第一个元素的值!) 所以p=&a[0] 与p=&a 等价

(1) p+i和a+i就是a[i]的地址,或者说,它们指向a数组的第i个元素。 (2) *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即a[i]。(3) 指向数组元素的指针变量也可以带下标,如p[i]与*(p+i)等价。 

[]实际上是变址运算符

对a[i]的求解过程是: 先按a+i×d计算数组元素的地址,然后找出此地址所指向的单元中的值。

#include <iostream>using namespace std;int main( ){ int a[10];int i,*p=a; //指针变量p指向数组a的首元素a[0]for(i=0;i<10;i++)cin>>*(p+i); //输入a[0]~a[9]共10个元素cout<<endl;for(p=a;p<(a+10);p++)cout<<*p<<″ ″; //p先后指向a[0]~a[9]cout<<endl;return 0;}      //效率高,对地址直接操作以下四种形况不同:(1) p++(或p+=1)。p=p+1. 把下一个地址付给p,p指向下一个元素(2) *p++。先得到p指向的变量, 然后p的值+1。如果输出得到的是前一个变量值。注意是p的值++ 并不是(*p)的值++,因为++和*同优先级,结合方向为自右而左,所以等同于*(p++),而p++先用p再++。(3) *++p。先加p,然后再得到p指向的变量,如果输出得到的是后一个变量值(4) (*p)++表示取p指向的变量然后让变量的值+1。如果输出是+1前的变量值实参数组名a代表一个固定的地址,或者说是指针型常量,因此要改变a的值是不可能的。 a++不被允许


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表