【无痛C指针】——入门篇

目录

前言

一、指针是什么?

1.内存

2.指针的概念

二、指针的用法

1.解引用

三、在32位/64位下各种类型大小的科普

总结


前言

大家好啊,我们又见面了,因为有很多同学尤其是刚接触C语言的同学可能会感觉指针这一块很难理解,不知道怎么学,所以这一次我将为大家讲解C语言指针这一节的知识。接下来的这几章C语言指针的知识十分的详细,会将很多细节,所以建议先收藏后再观看,以免后面找不到我了。接下来我们就开始指针的学习吧。


一、指针是什么?

1.内存

在讲解指针是什么的时候我们先来了解一下内存的概念。

内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。

我们了解了内存后,我们就可以开始学习指针了。

2.指针的概念

我们知道变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。那么我们是如何得到变量的地址并将它保存起来的呢,这个时候就需要用到我们的指针了。接下来我们来看看下面这个代码

#include<stdio.h>
int main()
{
	int a = 6;//因为a是整形,所以在内存中可以分配到4个字节。
	&a;//这个&符号就可以拿到a的地址
	return 0;
}

经过我们下面的调试后,我们知道了a的地址是0x0113F7F4,我们看见了数字6被存储在了a的地址里面,至于为什么是像 06 00 00 00 这样存储的可以去看看我另外一篇文章【数据的存储C语言】,在那里面很详细的介绍了数据是怎么存储的。

 我们调试后又发现,a的地址是0x0113F7F4,而a下面的一个地址就变成了0x0113F7F8,直接一下就跳过了4个字节,这是因为a是一个整形(int)占4个字节(byte),每一个内存单元大小刚好是1个字节(byte),而每个内存单元都有一个地址。但是如果这么说的话那么a就应该占4个内存单元了,也就是说a一共有4地址,但是为什么我们&a却只拿到了一个地址呢,这是因为我们&a拿到的其实是a的第一个字节的地址,因为我们知道a是整形(int),所以只用拿到一个地址(也就是a第一个字节的地址)就可以知道后面是什么地址了。这样就可以减少了很多麻烦。

虽然我们用&a拿到了a的4个字节的起始字节的地址,但是这个地址也是一个值呀,我们要如何将这个地址保存起来呢,这个时候我们就要用到指针来保存这个地址了。

这个时候我们就要用一个变量名为pa的变量来存储&a(&a就是a的4个字节的起始字节的地址),

可以先写成  pa = &a

但是我们在创建整形变量a的时候我们会在a前面加上int来表示a是一个整形变量(int a),用来存储一个整数。我们在创建字符类型的变量ch的时候,我们会在ch前面加上char来表示变量ch是一个字符类型的变量(char ch),用来存储一个字符。那么我们在创建存储&a这个地址的变量(pa)的时候也应该在pa前面加上pa的类型,用来表示pa是用来存储一个地址的。而变量pa的类型就叫做整形指针类型。用int *来表示(这只是用来存储整形地址的指针表达方式,简称整形指针),后面我们还会遇到字符指针(char *),数组指针,函数指针,二级指针等等,大家在这里先别着急,这些我都会在后面为大家一一介绍。

所以最终可以写成int* pa = &a,来存储&a得到的地址。

下面我们来详细拆分一下 int * pa = &a

这里的 * 号表示 pa 是个指针变量

这里的 int 表示pa执行的对象是int(整形)类型的。

我们又来看这个代码

#include<stdio.h>
int main()
{
	char ch = 'd';
	&ch;
}

我们这个时候想要存储ch的地址,我们就要用到char类型的指针(字符指针),也就是

char * ppa = &ch。

总的来说指针变量就是用来存放地址的变量。(存放在指针中的值都被当成地址处理)。

那么这下问题又来了,我们拿到这些int类型变量的地址、char类型变量的地址,难道就仅仅是为了把它们的地址存起来好看的吗?接下来我们就来看看指针的用法。

二、指针的用法

1.解引用

我们刚刚已经将a的地址和ch的地址存起来了,int * pa = &a,char * ppa = &ch。

如果我们有一天想用我们今天存储的这个地址来找的a和ch,并改变它们的值,这个时候我们就需要把存储地址的指针变量(pa和ppa)解引用来找到我们的a和ch。

*pa就叫做对 p 的解引用操作,我们通过解引用就可以找到a的值并改变它,简单来说pa就等于a的地址,将 p 解引用后 (*pa 就等于a的值),我们可以通过改变(*pa)的值来改变a的值。

于是就有了我们下面这个代码:

  

 

这种就是通过解引用指针变量来改变对应地址的变量就相当于间接的改变了该变量的值,有些同学可能会觉得这样来改变一个变量难道不是多此一举吗,我直接改变变量的值不快吗。但是我这里将会告诉你,指针如果用好了可以节省很多的空间,因为指针变量的大小的固定了的,不管指针变量存储什么类型的地址,指针变量的大小都是固定的。学到后面,你将会发现指针的很多优点。

因为这里是入门篇,所以我们这里就先来说说指针变量到底是多大,后面的章节我会更加深入的讲解指针。

上面我们说了指针变量的大小的固定的,那指针大小到底是多大的呢?

指针变量的大小取决于地址的大小

32位平台下地址是32个bit位(即4个字节)在此平台下,指针变量的大小为4个字节(byte)

64位平台下地址是64个bit位(即8个字节)在此平台下,指针变量的大小为8个字节(byte)

因为指针变量的大小是固定的,所以在32位平台下无论是什么类型的指针变量,它的大小都是4byte。所以在32位平台下,char * ppa 的大小和 int * pa 的大小是一样的,都是4byte,就算你指针存储的是一个数组的地址,这个指针变量的大小也是4byte。所以你不要看到 char 类型的是大小是 1byte,你就以为 (char *)类型的指针大小也是1byte的,这是一个易错点。

同理在64位平台下也是一样的,每个指针的大小都为8byte。

读到这里可能又有同学会问,既然指针类型的变量在32位和64位下大小是不同的,那么其他类型变量的大小会不会不一样呢,下面就由我来为大家科普一下。

三、在32位/64位下各种类型大小的科普

我们的指针入门篇到这里也就结束了,希望能带给初学C语言的小伙伴们一点帮助,如果对你有帮助的话别忘了点个赞哦,听说点赞的人都能进大厂,嘻嘻。


总结

简而言之指针就是地址,我们口语中说的指针通常指的是指针变量。这就是我们入门篇所学内容,指针初阶篇也将很快跟大家见面,大家敬请期待。

最后感谢大家能看到文章末尾,我在这里祝考研的同学都能上岸,找工作的小伙伴都能进大厂。期待我们下一次再见。

猜你喜欢

转载自blog.csdn.net/qq_64042727/article/details/123435805
今日推荐