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; //倒着存倒着取

image-20230717223229176

指针变量的指向类型决定了+1跨度

image-20230717224027040

image-20230717224536920

image-20230717233347986

image-20230717233629025

指针变量的注意项

void不能定义普通变量

void num; //不能给num开辟空间

void * 可以定义指针变量

void *p; //可以的

p 就是万能的一级指针变量, 能保存任意一级指针的地址编号

image-20230717234244654

但是它不能直接用

image-20230717234734872

指针变量不要越界访问

image-20230718170427492

数组元素的指针变量

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字节

image-20230718185447556

字符串指针变量存放的字符串放在文字常量区,只能读不能取

指针数组

数值的指针数组

image-20230718232703235

image-20230718233519927

字符的指针数组

image-20230718233924880

image-20230718234338681

字符指针数组和二维字符数组区别

image-20230718234609992

指针的指针

int num = 10; //0级
int *p = # //1级
int **q = &p; //2级

n级指针变量可以保存n-1 级的地址

image-20230718235042339

数组指针

数组首元素地址 和 数组首地址

int arr[5] = {10, 20, 30, 40, 50};

数组首元素的地址: &arr[0] == arr (+ 1跳过一个元素)

image-20230719162844288

数组的首地址: &arr (+1跳过整个数组)

image-20230719164933823

数组首元素地址编号 和 数组的首地址编号一致

int arr[5] = {10, 20, 30, 40, 50};
int (*p)[5] = &arr; //数组指针

image-20230720155906468

数组首地址取* == 数组首元素地址

image-20230720172201683

posted @ 2023-07-21 17:54  爱吃冰激凌的黄某某  阅读(18)  评论(0编辑  收藏  举报