指针和引用
指针的概念
数据在内存中是如何存取的?
系统根据程序中定义变量的类型,给变量分配一定的长度空间。字符型占1个字节,整型数占4个字节.....。内存区的每个字节都有编号,称之为地址。
1、直接访问
按变量地址存取变量的值。cin>>i; 实际上放到定义 i 单元的地址中。
2、间接访问
将变量的地址存放在另一个单元p中,通过 p 取出变量的地址,再针对变量操作。
一个变量的地址称为该变量的指针。
如果在程序中定义了一个变量或数组,那么,这个变量或数组的地址(指针)也就确定为一个常量。
变量的指针和指向变量的指针变量
变量的指针就是变量的地址,当变量定义后,其指针(地址)是一常量。
可以定义一个变量专门用来存放另一变量的地址,这种变量我们称之为指针变量。在编译时同样分配一定字节的存储单元,未赋初值时,该存储单元内的值是随机的。
指针变量定义的一般形式为:
指针变量同样也可以赋值:
也可以在定义指针变量时赋初值:
一个指针变量只能指向同一类型的变量。即整型指针变量只能放整型数据的地址,而不能放其它类型数据的地址。
*在定义语句中只表示变量的类型是指针,没有任何计算意义。
* 在语句中表示“指向”。&表示“地址”。
指针变量的引用
指针变量只能存放地址,不要将非地址数据赋给指针变量。
++, - -, * 优先级相同,都是右结合性。
指针变量作为函数参数:
函数的参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。
指针变量作为函数参数与变量本身作函数参数不同,变量作函数参数传递的是具体值,而指针作函数参数传递的是内存的地址。
输入a, b两个整数,按大小输出这两个数。
swap(int *p1, int *p2)
{ int t;
t=*p1; *p1=*p2; *p2=t;
}
void main(void)
{ int *point1, *point2, a,b;
cin>>a>>b;
point1=&a; point2=&b;
if (a<b)
swap (point1, point2);
cout<<“a=“<<a<<“,b=”<<b<<endl;
cout<<*point1<<“,”<<*point2<<endl;
}
用指针变量作函数参数,在被调函数的执行过程中,应使指针变量所指向的参数值发生变化,这样,函数在调用结束后,其变化值才能保留回主调函数。
函数调用不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。
用指针变量作函数参数,可以得到多个变化了的值。
数组的指针和指向数组的指针变量
数组与变量一样,在内存中占据单元,有地址,一样可以用指针来表示。C++规定:数组名就是数组的起始地址;又规定:数组的指针就是数组的起始地址。数组元素的指针就是数组元素的地址。
一、指向数组元素的指针变量的定义与赋值
二、通过指针引用数组元素
用指向数组的指针变量输出数组的全部元素
三、数组名作函数参数
数组名可以作函数的实参和形参,传递的是数组的地址。这样,实参、形参共同指向同一段内存单元,内存单元中的数据发生变化,这种变化会反应到主调函数内。
在函数调用时,形参数组并没有另外开辟新的存储单元,而是以实参数组的首地址作为形参数组的首地址。这样形参数组的元素值发生了变化也就使实参数组的元素值发生了变化。
1、形参实参都用数组名
2、实参用数组名,形参用指针变量
3、形参实参都用指针变量
4、实参为指针变量,形参为数组名