08_指针
指针
内存的概述
在32位平台,每一个进程有4G的空间
系统为内存的每一个字节分配一个32位的地址编号
指针变量的定义
定义步骤-
*修饰指针变量p
保存谁的地址 就先定义谁
指针变量的详解
在32 位平台任何类型的指针变量都是4字节
在64位平台位8字节
p====>变量地址
*p===>变量值
指针变量初始化
int *p = NULL;// int *p; p = NULL
指针变量的类型
指针变量自身的类型
将指针变量名拖黑,剩下的类型就是指针变量自身的类型
int *p; //p自身的类型为 int *
指针变量指向的类型
将指针变量名和离他最近的一个* 一起拖黑, 剩下的类型就是指针变量指向的类型
int *p; //p指向的类型为 int
tips:
&和* 相遇 从右往左 依次抵消
*&p == p
指针变量的指向类型决定了取值宽度
int num = 0x01020304; //倒着存倒着取
指针变量的指向类型决定了+1跨度
指针变量的注意项
void不能定义普通变量
void num; //不能给num开辟空间
void * 可以定义指针变量
void *p; //可以的
p 就是万能的一级指针变量, 能保存任意一级指针的地址编号
但是它不能直接用
指针变量不要越界访问
数组元素的指针变量
int arr[5] = {10, 20, 30, 4}
int *p = &arr[0]; //p == &arr[0] == arr,*p = arr[0] == *arr
字符串与指针
字符数组
char str1[128] = "hello world";
sizeof(str1); //128字节
字符数组先开辟128字节,然后把hello world放入,可以读取
字符串指针变量
char *str2 = "hello world";
sizeof(str2); //4字节 或 8字节
字符串指针变量存放的字符串放在文字常量区,只能读不能取
指针数组
数值的指针数组
字符的指针数组
字符指针数组和二维字符数组区别
指针的指针
int num = 10; //0级
int *p = # //1级
int **q = &p; //2级
n级指针变量可以保存n-1 级的地址
数组指针
数组首元素地址 和 数组首地址
int arr[5] = {10, 20, 30, 40, 50};
数组首元素的地址: &arr[0] == arr (+ 1跳过一个元素)
数组的首地址: &arr (+1跳过整个数组)
数组首元素地址编号 和 数组的首地址编号一致
int arr[5] = {10, 20, 30, 40, 50};
int (*p)[5] = &arr; //数组指针
数组首地址取* == 数组首元素地址