指针 (Part one)
看过我之前的博客的铁汁们应该都知道,我把递归比作C语言中的赤兔,吕布。而今天我要介绍的指针,就可以称作是C语言中的罗贯中了!
As is know to all,指针被普遍认为是C语言的灵魂。而在我看来,指针则是程序猿的魔法棒,让我们能够直接访问和修改内存中的数据,就像是使用魔法咒语一样;指针也是一个时间机器,你可以追踪程序的执行路径,查看变量的历史值,就像是穿越时空一样。
和递归一样,用得好你基本就可以看得懂C语言所有的题目,而用得不好你甚至会造成一些理论上的时间驳论。所以.....
这篇博客主要是对指针进行一些简单的介绍,毕竟任何知识都是从易到难嘛。
在C语言中每一块内存(字节)都有其独立的地址,如同宿舍的门牌号一样,而我们把这个地址称为指针,所以我们可以理解为:内存单元的编号 == 地址 == 指针。
在进一步学习之前,我们来了解一下两个操作符:
一. ‘&’ 取地址操作符,可以获取一个变量的地址。如图:
二. ‘*’ 解引用操作符,可以获取一个地址所指向对象的值。如图:
其中 ptr 称为指针变量 ,这种变量就是⽤来存放地址的,存放在指针变量中的值都会理解为地址。
此外,我们可以通过地址改变一个变量的值,如图:
这时候就有兄弟好奇了,在C语言中存在指针变量 ,那么存不存在数组,函数呢?他们的大小又是多少呢?其实,在C语言中存在着指针数组,数组指针,函数指针。而无论是什么类型,指针的大小均为8个字节或者4个字节。
欸?为什么说八个或四个呢?那是因为在x64和x86的环境下,指针的大小是不同的:
那既然指针的大小与类型无关,那为什么还需要各种类型的指针呢?废话不多说,我们来看一看一下一个程序:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main()
{
int n = 10;
char* pc = (char*)&n;
int* pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc + 1);
printf("%p\n", pi);
printf("%p\n", pi + 1);
return 0;
}
兄弟们觉得答案那几行一样呢?第三行和第五行是一样的吗? ○( ^皿^)っHiahiahia…
程序走起来后我们会发现 int 类型的地址加 1 与char类型的地址加 1 所得到的地址大 3,这是为什么呢? 这时候我们想到了 char 类型所占内存大小是一个字节,而 int 类型所占内存字节大小为四个字节,这时候我们就会得到:char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。
总结一下:指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)。
不知不觉洋洋洒洒已经写了这么多了,下篇会给大家介绍野指针和他的危害以及如何避免,assert断言以及与指针相关的计算,请大家继续支持大伟,三克油!(由于指针的重要性以及其内容的繁多,所以关于指针大伟会写好几篇,请大家继续期待哦~)
Your life, if you do not work hard, will anyone help you? ————黄色安全帽(抖音)
本篇博客也就到此为止了,送大家一碗鸡汤,勉励自己以及这世界上所有追逐梦想的赤子趁年华尚好努力提升自己,莫欺少年穷!