指针变量
内存的概述:在32位平台中,每一个进程 拥有4G的空间。
系统为内存的每一个字节 分配一个32位的地址编号(虚拟地址)。这个编号称为地址。
无论什么类型的地址,都是存储单元的编号,在32位平台下都是四个字节,即任何类型的指针变量都是4个字节大小。
地址和指针变量的关系
地址 就是内存的地址编号。
指针变量:本质是变量 只是该变量 保存的是 内存的地址编号。(不是普通的数值)
9527 |
普通数值
9527 |
是地址编号9527
指针变量的定义
1、定义步骤(定义的时候)
*修饰指针变量p。
保存谁的地址 就先定义谁。
从上往下整体替换。
案例1:
定义一个指针变量p 保存 int num的地址: int *p;
定义一个指针变量p 保存数组int arr[5]首地址: int(*p)[5];
定义一个指针变量p 保存函数的入口地址: int fun(int, int); int (*p)(int, int);
定义一个指针变量p 保存结构体变量的地址: struct stu lucy; struct stu *p;
定义一个指针变量p 保存指针变量int *p的地址: int **p;
2、在32位平台任何类型的指针变量都是4字节
在64位平台任何类型的指针变量都是8字节
3、指针变量和普通变量建立关系
int num = 10;
int *p;//在定义的时候,*仅仅为修饰p为指针变量
//在使用时,*p表示 取p所保存的地址编号 对应·空间的内容
p = #//普通变量和指针变量建立关系
cout << *p;//10
指针变量的初始化
指针变量 在操作之前 必须指向合法的地址空间。
1、指针变量 如果不初始化 立即操作 会出现段错误
int *p;
cout << *p <<endl;
2、指针变量 如果没有指向合法的空间 建议初始化为NULL
int *p = NULL;//NULL是赋值给p int *p; p = NULL;
不要操作 指向NULL的指针变量
3、将指针变量 初始化为 合法的地址 (变量的地址、动态申请的地址、函数入口的地址)
int num = 10;
int *p = # //int *p; p = #
int data = 10, *p = &data; //data为int类型 p为int *类型
int *p,data; //p为int *类型 data为int类型
指针变量的类型
1、指针变量自身的类型:将指针变量名托黑,剩下的类型就是指针变量自身的类型
int *p; p自身的类型为int *
指针变量自身的类型 一般用于 赋值语句的判断
int num = 10;
int *p = #
//在使用中
//num 为int &num 为int * ------->对变量名 取地址 整体类型加一个*
//p 为int * *p 为int ------->对指针变量 取* 整体类型减一个*
//在使用中 &和*相遇 从右往左 依次抵消
*&p == p
案例1:int num = 10, *p = &num, **p = &p;以下结果正确的是__ABC__
int num = 10;
int *p = #
int **p = &p;
A:*p = 100 B: *p = &num C:p = &num D:q = &num
2、指针变量指向的类型(重要)
将指针变量名和离它最近的一个*一起托黑,剩下的类型就是指针变量指向的类型
int *p; p指向的类型为int
3、指针变量的指向类型 决定了取值宽度
int num = 0x01020304;
int *p = #
为什么 *p == num == 0x01020304?
4、指针变量的指向类型 决定了+1跨度
p1+1表示它跳过了一个单位的跨度;(一个单位几个字节由指针变量的指向类型决定)p1+1跳过了四字节。