C语言指针的由来,为什么会有指针这个东西?

要弄明白指针,我们得先了解内存,我们先从内存开始说起。
内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的,所有为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节,为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存的地址
举例说明
我们中国国土面积有960万平方公里,我想在中国找某一所学校,或地方,比如,国防科技大学,我们不知道它在中国的哪里吧。我们肯定会打开百度,或者导航搜索一下,国防科技大学,具体在哪个省哪个市,那么导航和百度肯定会告诉我们它的地址,在湖南省长沙市,我们就可以通过这个地址方式去找到它。
那么在我们电脑的内存也是同样的思路。
我们的内存就是一个一个小的内存单元!
内存单元相当于(国防科技大学)
编号相当于(国防科技大学里的某一栋教学楼或者教室号)
我们可以通过地址,可以很好的定位到某一栋教学楼。
如图所示:

如图所示,我们来思考两个问题
1.如何给每个内存单元编号呢?
2.每个内存单元的大小是多少呢?
思路1:
我们内存中如何产生地址?有了地址就有编号!
举例说明:我们电脑是不是都有一个系统类型32位或64位,32位的系统类型如何产生地址呢?(计算机只能识别二进制)32位系统就会有32个二进制组成。

思路2:
那么这样的一个内存单元会是多大呢?
计算机中的单元 从小到大:bit ---byte---Kb---Mb----Gb---Tb.....
我们猜想一下我们的内存单元会不会是一个bit大?
如果我们的内存空间是一个比特位,那么我们32个比特位会是多大呢(GB)?
0001 0000 0000 0000 0000 0000 0000 0000 0000
这里的1代表的是2的32次方
转换为十进制为
4294967296
2的32次方的比特位就等于4294967296
把4294967296比特位换算成字节、kb、mb、gb分别是:
byte=4294967296/8=536870912
KB=536870912/1024=524288
MB=524288/1024=512
GB=512/1024=0.5
最后得到0.5GB
如果一个内存单元是个比特位的话,2的32次方比特位=0.5GB,也就是说我们只能访问内存0.5GB,所以32位类型的机器,给我们4个GB我们是不是也用不了。
所以我们试试一个内存单元是一个字节的话,
我们就用2的32次方比特位*8=4G 刚好可以访问4个G 的空间!!!
所以我们得到结论一个内存单元为一个字节。
所以在32位的平台上指针的大小为4个字节
在64位的平台上指针大小为8个字节。

我们来看一个列子

如图所示int a=10;
int整型,占4个字节,我们就在内存中给变量a4个字节的空间。
这就是给我们变量申请内存的一种方式。
以上就是我们的理论知识!!!
接下来,通过一个代码也体现我们的指针。

int a = 10;//10放变量a中存起来,变量a的类型为整型;&a;printf("%p",&a);//整型在内存中占4个字节,通过&a就能知道变量a在内存中的地址如图所示:

把变量a的地址存起来。

    int a = 10;//把10放变量a中存起来,变量a的类型为整型;    int* p =&a;//把a的地址放到指针变量p中存起来,p的类型为指针变量(int*)    printf("%p",&a);    printf("%p",p);

如图所示:&a=p 也就是p中存放了a的地址。

通过地址,找到a,并且修改a的值。
*p就是对p中的地址,进行修改。

int a = 10;//10放变量a中存起来,变量a的类型为整型;    int* p = &a;    *p = 20;//通过地址找到a,修改a中的值。    printf("a=%d", a);

注:指针类型区分。
整型指针变量int p
字符指针变量 char
pc
……

©著作权归作者所有:来自51CTO博客作者ンめ的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 一次内存性能提升的项目实践
  2. 挑战Redis单实例内存最大极限,“遭遇”NUMA陷阱!
  3. 自学Python的第一天
  4. 判断字符串是否为空变量
  5. 第2章 0126-细说变量与常量,课程笔记、心得(数据类型的转换与检测
  6. 变量的数值运算与特殊应用
  7. 计算变量长度
  8. C语言:未声明的标识符 问题解决
  9. 败家玩意儿!Redis 竟然浪费了这么多内存!

随机推荐

  1. go语言数据类型转换教程
  2. Go语言中GOROOT、GOPATH、GOBIN详解
  3. golang单元测试怎么写
  4. golang 如何开启协程
  5. golang代码能不能加密
  6. golang出现panic是什么原因
  7. golang的不足之处是什么?
  8. golang 什么时候使用指针
  9. golang编译器用什么写的
  10. golang 如何结束一个协程