什么是地址
地址就是变量 数据 常量等等在内存中存储的地址,之前学过汇编的同学应该知道,内存的基本单元是字节,都是一格一格分布的,每个单元都有它对应的地址,就好像门牌号一样。
系统api用过地址找到内存存放的内容 也是字符v
地址这么长不方便我们书写 我们是不是可以找一个容器存放这些地址—> 指针
指针
定义一个指针
定义一个什么类型的指针就在类型后面加一个* 比如要定义一个字符指针 char* c; 他没有存放或者指向任何地址 c = &str; 于是乎指针就指向了地址 就可以用指针作为地址的”发言人”。
指针变量作为一个变量 是为了存储指针类型(地址)的变量 故指针变量存储或者指向的就是&str 指针变量的地址就是&c 我的命名规范不标准 一般是p(poniter)
+指针名字
& 是取地址符号 可以获取其他变量的地址
内存视图;
上图是我们新建一个变量在内存中的存储视图 接下来我会画一个指针在内存中的视图 请各位辨析
如何获取 指针指向地址的值 通过解引用
即在要解引用的指针前加一个*
int a = 5;
int * a = &a;
printf(“%d \n”,* a );//结果是5
代码中的实际应用:
指针是可以进行加减运算的,跨越的空间要看声明指针的基本类型是什么 如果是char
则 是1个字节 如果是int
则是四个字节递增 *(p+1)表示取出p递增4个字节的地址的值
如果这个地址中的值没有赋值 则会返回一个垃圾值
为什么指针会有类型
既然指针是存放地址的变量,那为什么不能找一个通用的指针类型存放指针,而要有那么多类型的指针。这就要说到解引用了,因为我们不光用指针存放一个地址,而且它还要解引用,读取和修改内存的值,不同的数据肯定是不同的数据类型存储的,所以我们解引用肯定要对应相应的类型。
下面我用一段代码来说明:
int a = 1025;
int* p = &a;
char* p0 = (char*)p;
printf("size of int %d\n", sizeof(int));
printf("address of p %d value of p = %d\n", p,*p);
printf("szieof char %d\n", sizeof(char));
printf("address of p0 %d value of p0 = %d\n", p0, *p0);
为什么解引用字节型指针和整数型指针的解引用会有差异 这就要从第一篇文章 进制开始讲起了 以32为系统为例 int*
表示整数型指针 如果解引用的话,系统会在p指向的地址取四个字节 如果强转成char *
那么系统只会取到一个字节 高位会被忽略
void指针
void指针是一种不明确类型的指针,任何指针都可转换为void指针。
void指针只保存了 指针的值 并没有记录 指针指向对象的类型。因此在解引用void指针时候,要明确类型,直接解引用是错误的。
网站标题:CV鼻祖洋芋
原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/uncategorized/77/
本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!