主要内容:指针(C语言的代表,会C语言不会指针,恭喜你C语言白学了)
一、数据的存储
字节是最小的存储单位(byte),一个字节成为一个存储单位(内存单元),不同的数据类型占用的存储单元是不同的(1个字节是8位)
char1个字节(byte)8位(bit)
short2个字节(byte)16位(bit)
int4个字节(byte)32位(bit)
long8个字节(byte)64位(bit)
float4个字节(byte)32位(bit)
double8个字节(byte)64位(bit)
为了正确的访问内存单元,每个内存单元都有编号,每个编号成为内存地址,内存单元中的内容是我们需要用的
二、数据的访问
直接访问:直接访问内存地址中的内容
简介访问:通过内存地址访问内存中变量的值
指针是最常用的间接访问方式,间接访问方式随处可见
访问方式:
通过指针变量指向所定义的数据类型所开辟的内存单元的编号得到存储的值
三、指针变量
存放内存地址的变量(通俗讲就是存放自定义变量的地址的变量)
int *p = NULL 初始值恒等于0
通过int可以看出是一个整型指针
注意:指针变量所占用的字节数只与操作系统有关
输出打印地址的转换符是 “ %p ”
四、取址运算符& 和取值运算符 *
int a = 3,b = 1;/ / 自定义整型变量 a = 3,b = 1
int *p = &a; / / 定义一个指针p,用取址运算符&取出a的内存地址赋值给指针p
printf(" %p ", p)/ / 输出打印指针p所指向的地址值
& 和 * 是配套的操作符
五、指针的算术运算
注意:指针只有加( + )、减( - )运算
int *p = &a// 指针类型决定移动几个字节
p++:指针向高位移动4个字节
p--:直接向低位移动4个字节
指针的重指向
int a = 3, b = 5;
int *p = &a; / / 将指针p指向a的地址,得到a的地址值
p = &b; / / 讲指针重新指向b的地址,得到b的地址值
指针变量的赋值意味着重指向
*p:1、指针变量定义时,只起修饰作用,告诉编译器p是个指针
2、指针变量取值时,访问内存地址为p的地址
六、指针与数组
数组:是用连续内存空间存放数据的构造类型
数组名:数组首元素的地址
示例:
int arr [] = { 1, 2, 5, 6};
arr 恒等于 arr[0]
*p、*(p + 1)和*p + 1的区别
*p:代表p的地址
*(p + 1):将指针p向上移动一个单位
*p + 1:p的地址加1
数组本身就是一个指针(指针可以当数组名使用)
指针与数组的区别
指针:只与系统操作系统位数有关
数组:与元素个数和类型有关
那么,用指针能否算出数组元素个数?
有结尾标示的数组能算出元素个数,例如字符数组
整型数组、浮点型数组都不能
指针与字符串
指针可以操作字符,也可以操作字符串
示例:
char string[] = " iPhone " ; / / string为数组名
char *p = string; / /指针p指向字符数组首地址
*(p + 1) = ‘ v ‘ ; / /操作单个字符
printf(" %c " , p + 1); / /操作整个字符串
七、指针数组
存放指针的数组称为指针数组
示例:
char *string[3] = {" iPhone ", " Plus ", "iPad"};
注意:可以通过指针修改字符数组,但是不能修改常量字符串
指针与函数
即指针作为参数
数组名代表数组的首地址,而且是常量地址,不可被修改