第八周(笔记)
8.1 指针的基本概念和用法
- 指针的基本概念
- 指针,也称作指针变量,大小为4个字节(或8个字节)的变量,其内容代表一个内存地址。
- 通过指针,能够对该指针指向的内存区域进行读写
- 如果把内存的每个字节都想成宾馆的一个房间,那么内存地址就相当于房间号,而指针里存放的就是房间号
- 指针的定义
- 类型名字 * 指针变量名;例如:int * p , char * pc , float * pf
- 指针的内容
- int * p = (int * ) 40000;p指向地址40000,地址p就是地址40000 ( * p)代表地址40000开始处的若干个字节的内容
- 通过指针访问其指向的内存空间
- int * p = (int * )40000; * p = 5000; int n = * p;解释:①往地址40000处起始的若干个字节的内容存储的空间里写入5000,②将地址40000处骑士的若干字节内容赋值给n(若干=sizeof(int)因为int * )
- 指针用法:char ch1 = ‘A’;char * pc = &ch1; (&:取地址运算符)
8.2 指针的意义和互相赋值
- 指针的作用
- 有了指针,就有了自由访问内存空间的手段
- 不要要通过变量,就能对内存直接进行操作,通过指针程序能访问的内存区域就不仅限于变量所占据的数据区域。例如:用指针p指向a的地址,然后对p进行加减操作,p就能指向a后面或前面的内存区域,通过p也就能访问这些内存区域
- 指针的互相赋值
- 不同类型的指针,如果不经过强制类型转换,不能直接相互赋值
8.3 指针的运算
- 两个同类型的指针,可以比较大小(比较的是地址)
- 地址p1 < 地址p2 == p1 < p2 值为真
- 两个同类型的指针变量,可以相减
- 两个T * 类型的指针p1和p2,p1 - p2 = (地址p1-地址p2)/sizeof(T)
- 例如:如p1指向地址1000,p2指向地址600,则p1-p2 = ( 1000-600)/sizeof(int) = (1000-600)/4 = 100;也就是说p1这个地址到p2这个地址之间能放下100个int型变量
- 指针变量加减一个整数的结果是指针
- p: T * 类型的指针,n:整数类型的变量或常量,p+n:T * 类型的指针,指向地址:p+n * sizeof(T)
- 指针变量可以自增、自减:p++:p指向 n+sizeof(T类型)p–同理
- 指针可以用下标运算符" [ ] ":p[n] 等价于 * (p+n)
- 通过指针实现自由内存访问
- 如何访问int型变量a前面的那一个字节,如果使用–p的话访问的是前面四个字节,所以我们可以用强转,转为char之后再减减(运行可能出错,因为你不知道前一个字节是否能访问)
8.4 指针作为函数参数
- 空指针
- 指针0不能访问。只想地址0的指针就是空指针(可用NULL表示)
- 指针可以作为条件表达式使用。如果指针的值为NULL,则相当于为假,值不为NULL,就相当于真,例:if§ 等价于 if(p!=NULL) if(!p)等价于 if(p==NULL)
- 指针作为函数参数
8.5 指针和数组
- 数组的名字是一个指针常量,指向数组的起始地址
- 例如 T a[N]; a的类型是T * ,可以用a给一个T * 类型的指针赋值,a是编译时其值就确定了的常量,不能够对a进行赋值
- 作为函数形参时, T * p 和 T p[ ] 等价
- 例如: void Func (int * p)与void Func (int p[ ])是相等的
#include <iostream>
using namespace std;
int main()
{
int a[200];
int * p;
p = a;
* p = 10;
* (p+1) = 20;
p[0] = 30;
p[4] = 40;
for (int i = 0;i<10;i++) {
*(p+i) = i;
}
p++;
cout << p[0] << endl;
p = a + 6;
cout << * p << endl;
return 0;
}
|