C++ 引用(底层是指针)
C语言程序在内存中的分布 4G的虚拟内存空间 编号:0x0000 0000 - 0xffff ffff
4G = 2^2 * 2^30 byte = 2^32 byte
一个地址只能存储1byte数据
所谓的内存 其实是一个 int 类型的编号 通常显示为十六进制 %p
指针即内存地址
定义变量意味着分配内存 变量其实是代表着那一片内存里的数据,操作变量实际上是操作内存里的数据, 所有的变量(除了register)其实都可以通过&来获取该变量在内存中的存储位置,如果确定了一个内存地址,可以通过*来获取该内存区域里的数据。
& 取址运算符 变量(除了register)
*取值运算符 确定地址的类型 涉及一个取多少个字节数据的问题
&* *& 相互抵消 过程正好相反
指针变量: 存储内存地址的变量
指针变量的定义:
数据类型*标识符:* 在定义时表示是指针类型
int *p; p是int*类型
int *p1,p2; p1是int *类型 p2是int类型
指针变量初始化:
指针变量一般初始为NULL 空指针 0x0000 0000
一般用 != NULL 来判断一个指针变量是否可以取*运算
野指针:未初始化的指针变量(指向不确定 指针变量中存储的值不确定)
野指针非常危险 ,编译时不会检查;程序可能正常,可能逻辑错误,可能崩溃。
万能指针 void *:
任何类型的指针都可以隐式转换成void *
void*类型的指针都可以隐式转换为任何类型的指针
除上述情况以外,任何指针类型之间的转换需要强制类型转换
(目标类型)源变量
不能对万能指针进行取*运算
指针变量的操作:
指针变量 = 指针(内存地址 &变量)
*指针变量 取内存地址的值
指针变量加减整数±:
指针变量+1 指针变量的值加了一个内存地址中数据类型的单位长度
指针与一维数组(数组是一片连续的内存空间):
[] 数组下标运算符 *()
arr[i] == *(arr+i)
*(arr+i) == *(i+arr) == i[arr]
int arr[10] = {0};
arr == &arr[0] 一维数组名即首元素地址
&arr[0] == &*(arr+0) == arr
数组作为函数参数传递时:传递的其实是数组首元素的地址
void func(int arr[长度],int n){
sizeof(arr) == 4/8
}
void func(int *arr,int n){
\\在函数中修改数组元素的值会影响实参数组的值
}
sizeof(指针) == 4/8