第6章 善于利用指针与引用
6.1 什么是指针
1 变量里存的是内容,这个内容在何处?

在内存中申请了一段空间。我们用a来标识,把5赋值,20赋值。A与内存的一段地址相关系。

2 如何看变量的内容与地址?
内容与地址不同,定义一个变量后。只要程序未结束,地址不会变。而内容可变。
变量 内容 地址 int a=5 ; a=20
酒店 客户 房间号 张三住在305; 李四住在305
3 直接访问与间接访问某个变量。
如果用一个变量获得另一个变量的地址。可能用两种方法访问变量。
#include < iostream>
using namespace std;
int main()
{
int a=5;
cout<<a<<endl; //直接访问
int *p=&a;//变量p得到了a的地址
cout<<*p<<endl; //间接访问
return 0;
}
6.2 变量与指针
1 特殊的变量类型,指针变量。
原来所学的每个变量都是存数的。
特殊的变量用于存储变量的地址----》指针变量。
2 定义指针变量 (不是变量名的一部分)
基类型 变量名;
在定义时,变量名前加,表示此变量是一个指针变量。
变量名为p,不是p;
3 所有的指针变量占据内存大小都相同。
在64位devC++ 每个指针变量占8个字节
在vs2010中,每个指针变量占4个字节。
为什么指针变量所占内存大小 相同。地址 类似于房间号。
房间有大小,房间号位数都相同。
4 指针变量是存地址的,未赋值之前不允许通过指针变量赋值。
5 在定义指针变量时赋值与定义后赋值形式上的不同。
#include < iostream>
using namespace std;
int main()
{
int a,*pa;
int b,*pb=&b;//在定义时赋值,把b的地址赋值给pb
pa=&a;//在定义后赋值,把a的地址赋值给pa;
int c;
a=20;
b=30;
c=a+b;
cout<<c<<endl;
*pa=2;//在定义后 *pa表示取pa所指示单元的值
*pb=4;
cout<<“a=”<<a<<endl;
cout<<“b=”<<b<<endl;
return 0;
}
6 如何查看一个变量所占内存为几个字节(sizeof运算符)
7 既然所有的指针变量所占内存大小都相同,那类型有什么用?
指针变量的类型 --》基类型(表明,此变量可以存储什么样地址。
int *pa; pa的基类型为int,只能存储 int型地址
double *q; q的基类型为double,只能存储double型的地址。
a占据的内存单元是fe3c。是不是一个字节。Fe3d 3e 3f
d占据的内存单元fe30,是不是一个字节?,也不是。8个字节30,31,。。。37
指针变量的基类型,表示,从这个地址处,连续几个字节归指针变量管。
8 不允许给指针变量赋整数(除了初始化为NULL)。
int *p=NULL; 实际赋值为0,表示指针变量未指向任何地址
9 指针变量一旦定义,只能指向与基类型相同的变量地址。
10 有关指针运算的两个运算 (&取地址 *取地址处的内容)
在定义时用不到 &.
在定义时 * 表示此变量是一个指针变量
在定义后 & 取地址 *取地址处的内容
11 两个指针变量可以指向同一个变量吗?
三个服务员得到同一个房间号,服务时是同一个房间。
例(输入a和b两个整数,按先大后小的顺序输出a和b(用指针变量处理)) (方法:使用两个指针变量指向a,b. 比较后,使其中一个指针指向大数,另一个指向小数。两个变量不变)
12 不使用指针变量,能否写一个函数交换两个变量的值?
传递参数a—》x b-(y 传递是一种单向传递。A与x b与y占据的是不同的内存空间
改变了x不会影响 a
13 使用指针变量,能否写一个函数交换两个变量的值?
#include< iostream>
using namespace std;
int main()
{
void swap(int *p1,int *p2);
int *pointer_1, *pointer_2,a,b;
cin>>a>>b;
pointer_1=&a;
pointer_2=&b;
if(a<b)swap(pointer_1,pointer_2);
cout<<“max=”<<a<<" min="<<b<<endl;
return 0;
}
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}