指针及相关 Part1

来源:互联网 发布:php简单企业网站源码 编辑:程序博客网 时间:2024/05/21 02:35

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

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

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


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

int i,j; //定义整型变量i,j
int *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 2
void swap(int *p1, int *p2){
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;

p1,p2均为指针变量。这里并没有交换指针的朝向,而是交换了指向的两个变量本身的值
调用: swap(pointer_1,pointer_2);  传进去的实参必须是指针变量,*pointer_1 是一般变量不是指针变量


//code 3
void swap(int *p1, int *p2){
int *temp;
*temp=*p1;
*p1=*p2;
*p2=*temp;

会出错, 因为此时temp是指针变量但并没有让它指向谁,没有分配内存,所以不能用*temp=*p1。



// code 4
void swap(int *p1, int *p2){
int *temp;
temp=p1;
p1=p2;
p2=temp;

不会出错,功能是交换两个指针变量所保存的值(指向的变量的地址),不能交换两个一般变量的值。



// code 5
void 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++不被允许

                                             
0 0