在刚开始学习C语言时,我认识了各种数据类型,比如int整型,float单精度浮点数,char字符等等,而指针也是一种数据类型。这些数据类型都有对应的存储格式,比如int是4字节,也就是32个比特位,而char只有1字节的空间,对应8个比特位。
这里一个比特位只能用0或1来表达,而字符则需要使用到之前的ASCAII码表来进行对应的转化。
说到指针,内存相当于一列表格而每一格就是一个字节的空间。
而这些格子都有各自的编号,这些编号就是对应存储空间的地址,指针就是这么一种存放地址的变量。基于之前不同数据类型所需要的内存空间不同,每一个格子就是一个编号,所以char类型的数据地址只有1个地址编号,而int类型的数据的地址就有4个地址编号。
我逐渐明白了指针的含义,就像它字面上所说的,像导航一样指向我们需要的内存地址,调用空间中的内容。
这里在代码中出现了void
void test01()
{
int num = 100;
printf(“%p\n",&num);
int *p = NULL;
printf(“sizeof(p) =%d\n",sizeof(p));
}
这里的void是无类型指针,可以指向任何的数据类型,也不要返回,所以可以用来在程序中进行测试,而不需要更换主函数中的内容来不断调试。只需要在主函数中更换test123即可。
int*p是指针这一数据类型定义时的格式,在取地址时用到符号&,在取地址里面内容时用到的就是*,这里的*是一个运算符而不是指针变量的一部分。
关于指针,这里只进行了初步的理解,也埋下了许多的伏笔,比如每一格个指针变量也被存储在计算机中,那它也有对应的地址,可以被另一个指针所指向。而在实际应用中,指针通过内存的地址与数据进行关联,可以让数据的调用更加方便。比如在游戏里,我设定玩家的拥有金币,而金币是随着玩家的操作进行整数级的不断变化,那我将金币这一数值对应到一个固定的地址里,这个地址里的数据类型为long,那在游戏改变时,我用*来取用这个地址里对应金币数量的数值,再通过各种加减变化这个地址里的数值,就可以实现金币的获取与消耗了,同时也不会产生名称的冲突。