指针初始

大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Spring系列框架、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

指针初识

C语言系列1我们已经介绍过了指针一些相关的概念,我们再来复习一下。

基本概念

指针是什么?

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

通俗点讲指针就是一个变量,指针变量存储了地址(内存单元编号)。通过这个地址(编号)就可以找到该内存空间进行访问。

内存

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

int a创建了一个4字节的内存,而我们根据第一个字节的地址编号就可以找到a的4个字节。 所以a的地址就是第一个字节的地址编号。 而地址编号又是怎么来的呢?

对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的是产生一个电信号正电/负电(1或者0)

那么32根地址线产生的地址就会是:

00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
...
11111111 11111111 11111111 11111111


这里有2^32个地址,每个地址又对应一个存储单元。 2^32bit=2^32/2^10kB....=4GB所以我们可以知道,32根地址线可以为内存4 G大小的编址,64位机器同理。

我们说了指针也是一个变量,变量就要有空间存储,所以指针需要多大内存空间存储呢?32根地址线,能组成一串32位二进制字符串,1位二进制为1bit所以地址大小为4byte.。 64位机器地址大小就是8byte总结

32位平台,指针大小为4byte64位平台,指针大小为8byte

指针及其类型

我们知道变量都有类型,指针变量也不列外。

int a=2;
int* pa=&a;  //int 类型的指针变量pa。

我们刚刚说过,指针大小在不同平台下为4/8byte就是说不同类型指针大小也相同?32位平台64位平台可以看到,确实如此,不同平台不同类型的指针大小相同。 那指针的类型有什么意义嘛? 两个不同类型的指针(地址)相同。 我们知道int*pa=&a;int有4个字节,而地址就是第一个字节地址编号,所以char*pc也存储了int a的第一个字节编号,所以两个地址相同

指针的解引用

int *pa=&a; *pa=1; char *pc=&a; *pa=1;我们可以清楚的看到 初始化int a=0x0012ff33;(0x表示16进制的数据) int *pa=&a; *pa=1; : a=0x00000001; char* pc=&a; *pc=1;: a=0x00 f f 1201; *pc只能对int a一个字节解引用,访问一个字节。

总结:

指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。比如:char*的指针解引用就只能访问一个字节,而int*的指针的解引用就能访问四个字节。

#C语言#
全部评论
讲的非常详细,懂了
点赞 回复 分享
发布于 2022-10-11 14:21 陕西

相关推荐

评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务