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 ……