指针初始
大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Spring系列框架、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
- CSDN java领域新星创作者blog.csdn.net/bug..
- 掘金LV3用户 juejin.cn/user/bug..
- 阿里云社区专家博主,星级博主,developer.aliyun.com/bug..
- 华为云云享专家 bbs.huaweicloud.com/bug..
指针初识
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
一个字节解引用,访问一个字节。
总结:
#C语言#指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。比如:
char*
的指针解引用就只能访问一个字节,而int*
的指针的解引用就能访问四个字节。