持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
指针
内存的概念
在说另新人感到发指的指针之前,我们先聊一聊内存这个概念。
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
而内存单元的编号通过地址线通电或者断电产生的数字信号0/1的组合来表达内存单元的编号,如生活中32位,64位机器,就是指的是多少跟地址线,一根地址线表达一个0或者1,32位就是32跟地址就是32个0或者1组成的地址长度,这里地址编号由0x(区别十进制和十六进制用的像前缀一样的东西!)+8个十六进制(等效为32个二进制)
变量是创建内存中的(在内存中分配空间的),每个内存单元都有地址,所以变量也是有地址的。 取出变量地址如下:
#include <stdio.h>
int main()
{
int num = 10;
printf("%p\n", &num);
return 0;
}
&num是取出num的地址,注意:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址),printf打印地址,%p是以地址的形式打印。
指针变量的定义
上面我们已经解释的指针到底是什么,不要把它想得过于困难,过于高大上,简单认为其实就是一段数字而已。
#include <stdio.h>
int main()
{
int num = 10;
int* p = #
*p = 20;
return 0;
}
注意:这里使用指针变量的和上面定义指针变量的完全不一样!
把地址存储到指针变量并不是我们最终的目的,就像你的家庭地址,并不是为了单纯的记住,而是有一天可以去你家找你请你吃饭什么的,所以这里的p为存放num地址的指针变量,pc这个是解引用操作符,要清晰的区分两个的作用!定义时的是格式需要,代表这个类型是指针变量类型;使用时的*是解引用操作符,通过p存储的地址在内存中找到地址对应的变量,来进行其他操作的!
储存是为了更好的找到!
指针变量的大小
#include <stdio.h>
//指针变量的大小取决于地址的大小
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
printf("%d\n", sizeof(char *));
printf("%d\n", sizeof(short *));
printf("%d\n", sizeof(int *));
printf("%d\n", sizeof(double *));
return 0;
}
指针变量的大小,不取决于指针变量指向的变量类型而取决于多少位的平台!因为在多少位平台就有多少位二进制来表达你的数据地址!我们算的大小不是数据的大小,而是数据地址的大小,数据地址大小又取决于多少位平台下多少个bit位的表达,sizeof用字节表示大小,所以地址大小用字节表示只有4或8的区别!