地址与首地址
- 不学指针不影响编程 甚至很多编程语言没有指针
- 指针是内存最灵活最基础的调度方式
- 内存的基本(最小)单位:比特位 bit 以为二进制 一个晶体管
- 内存的基本(最小)管理单位:字节 byte 一个字节是8个比特位
1b == 1字节
1k == 1024b
1M == 1024k
1g == 1024m
1t == 1024g
地址:每一个字节的内存段都有一个唯一的(从0开始的正整数并且不间断)与之对应
首地址:一块内存中最小的那个地址,称之为首地址简称为地址
& 取首地址 简称为取地址运算符
& 获取其右操作数的首地址
int n;
问题?n有几个地址
答:4个
why?int类型占4个字节 每一个字节都有唯一的地址
// & 取首地址
#include<sdtio.h>
int main()
{
int n;
printf("&n:%d\n",&n);
printf("&n:%x\n",&n);
printf("&n:%p\n",&n);
return 0;
}
指针
- 指明一块内存段
- 已知内存段大小和首地址,是不是整个内存段都知道
- 既然如此那么这个首地址就称之为指针
指针 == 首地址 == 地址 == 正整数
整数就是一个数
地址除了是个数,还能标记一字节内存段
首地址除了能标记一字节内存段,还附带说明后面还有。。
指针带类型 能够说明一块内存段
指针变量
- 存指针的变量
int n;//n 是整型变量
char c;//c 是字符型变量 字符变量
float d;//d 是浮点型变量 单精度浮点型变量
- 指针变量简称指针
定义变量的语法规则:
类型名 变量名;
定义指针变量的语法规则:
类型名 变量名;
指针变量的类型名:指向内存段类型名*
int* p; //p存储 的指针 是指向 int类型内存段的
char* p;//p存储 的指针 是指向 char类型内存段的
float* p;//p存储 的指针 是指向 float类型内存段的
double* p;//p存储 的指针 是指向 double类型内存段的
不管是什么类型的指针变量 都是指针 都是首地址 都是地址 都是整数
车牌:
绿牌 黄牌 蓝牌 红牌 黑牌
虾 螃蟹 螃蟹 虾
问:指针变量多大?p占几个字节
答:4个字节
解引用
- 引用:使用
- 引用变量就是访问变量绑定的内存段
- 解引用:是找指针指向的内存段,能且只能作用于指针
- 引用指针变量就是直接使用指针变量绑定的内存段
- 解引用指针变量是使用指针变量绑定的内存段中存放的指针指向的内存段
- 解引用就相当于根据地址找地方
- 内存段中存储的数据 就相当于 在这个地方上的人
注意区分数据和内存段,解引用返回的是内存段!不是数据!
解引用运算符: *
单目运算符 有且只有右操作数
*p p是指针变量名或者指针
注意和 定义指针变量时候的* 还有 乘法运算符* 区分开来
定义指针变量的时候 * 是双目运算符 左边类型名 右边变量名
乘法运算符 双目 左右两边都是数值表达式
如果p是n的首地址,我们就说 p指向n
指针指向内存段!
指针变量的数学运算:
char* +1
int* +4
double* +8
带类型
搞清楚:
地址 首地址 指针 指针变量 解引用