个人网站备案通过后,北京模板网站开发,网站开发客户需求,博客网站怎么搭建指针是什么#xff1f; 指针是什么#xff1f; 指针理解的2个要点#xff1a; 指针是内存中一个最小单元的编号#xff0c;也就是地址 平时口语中说的指针#xff0c;通常指的是指针变量#xff0c;是用来存放内存地址的变量 总结#xff1a;指针就是地址#xff0c;口… 指针是什么 指针是什么 指针理解的2个要点 指针是内存中一个最小单元的编号也就是地址 平时口语中说的指针通常指的是指针变量是用来存放内存地址的变量 总结指针就是地址口语中说的指针通常指的是指针变量。 那我们就可以这样理解 内存 指针变量 我们可以通过取地址操作符取出变量的内存其实地址把地址可以存放到一个变量中这个 变量就是指针变量 #include stdio.h
int main()
{int a 10;//在内存中开辟一块空间int *p a;//这里我们对变量a取出它的地址可以使用操作符。//a变量占用4个字节的空间这里是将a的4个字节的第一个字节的地址存放在p变量
中p就是一个之指针变量。return 0;
}总结
指针变量用来存放地址的变量。存放在指针中的值都被当成地址处理。
那这里的问题是 一个小的单元到底是多大 1个字节 如何编址
经过仔细的计算和权衡我们发现一个字节给一个对应的地址是比较合适的。
对于32位的机器假设有32根地址线那么假设每根地址线在寻址的时候产生高电平高电压和低电 平低电压就是1或者0 那么32根地址线产生的地址就会是 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 … 11111111 11111111 11111111 11111111 这里就有2的32次方个地址。
每个地址标识一个字节那我们就可以给 2^32Byte 2^32/1024KB 232/1024/1024MB232/1024/1024/1024GB 4GB 4G的空闲进行编址。
同样的方法那64位机器如果给64根地址线那能编址多大空间自己计算。
这里我们就明白
在32位的机器上地址是32个0或者1组成二进制序列那地址就得用4个字节的空间来存储所以 一个指针变量的大小就应该是4个字节。那如果在64位机器上如果有64个地址线那一个指针变量的大小是8个字节才能存放一个地 址。
总结 指针是用来存放地址的地址是唯一标示一块地址空间的。 指针的大小在32位平台是4个字节在64位平台是8个字节。
指针和指针类型
指针也是有类型的
X86 32位环境
X64 64位环境 int main()
{char* pc NULL;short* ps NULL;int* pi NULL;double* pd NULL;//sizeof返回的值是无符号整型 unsigned int 用%zu来打印printf(%zu\n, sizeof(pc));printf(%zu\n, sizeof(ps));printf(%zu\n, sizeof(pi));printf(%zu\n, sizeof(pd));return 0;
}现在用64位环境运行上面的代码 现在用86位环境运行上面的代码 既然指针大小都是固定的为什么还要区分指针类型呢 指针类型
我们来看下面的代码
int main()
{int a 0x11223344;//0x开头的是16进制数字两个十六进制数字代表一个字节//0001 0001 0010 0010 0011 0011 0100 0100return 0;
}我们看调试窗口 可以看见确实是占用了四个字节
int main()
{int a 0x11223344;//0x开头的是16进制数字两个十六进制数字代表一个字节//0001 0001 0010 0010 0011 0011 0100 0100int* pa a;*pa 0;return 0;
}我们再往下一步可以看到四个字节一下子都被修改了 那如果我们改为char*呢 我们只改动了一个字节
因为我们所使用的是char*类型的指针所以一次只能修改一个字节
指针类型的差异并没有决定所占大小但是决定了被解引用所访问的字节 指针±整数
int main()
{int n 10;char* pc (char*)n;int* pi n;printf(%p\n, n);printf(%p\n, pc);printf(%p\n, pc 1);printf(%p\n, pi);printf(%p\n, pi 1);return 0;
}我们可以看到两个地址放的是同一个值
但是int*往前走了4个字节
char*只走了1个字节
**结论**指针的类型决定了指针1操作时跳过几个字节
可以通俗的理解为决定了指针的步
int和float都是解引用访问四个字节那么int*和float*可以通用吗
int main()
{int a 0;int* pi a;float* pf a;*pi 100;return 0;
}可以看到已经成功存入 那如果是这样呢
int main()
{int a 0;int* pi a;float* pf a;*pf 100.0;return 0;
}那这样子就不一样了float*认为内存中放的就是浮点数所以放进内存的时候默认为浮点数形式
那么照这么看int*和float*就是不能混用的