char *p;sizeof(p)=?

一世执手 提交于 2020-03-04 07:51:25

sizeof(指针)是指针变量占用内存的大小(字节数),而指针是存储变量地址的,变量地址的长度即为指针变量所占内存大小,尽管不同类型变量所占内存大小不同(int四字节、char一字节),但指针存的只是首字节地址,不同的是指针递增时,增加的地址。
所以在32位机上,所有指针类型变量占用内存字节数都为4
因为32位机就是 4字节 * 8个二进制位/字节 计算出来的.
如果在64位机上,指针占用内存大小就是8个字节.

也有一种说法,指针是存变量地址,变量地址的长度与编译时使用的编译器有关,一般VS是win32,即32位,所以指针长度一般位4字节(4*8)

#include <iostream>
using namespace std;
int main(){
	char c;
	char *pc=&c;
	int a;
	int *pa=&a;
	cout<<sizeof(c)<<"\t"<<sizeof(pc)<<"\t"<<(void *)pc<<"\t";
	pc++;
	cout<<(void *)pc<<endl;
	cout<<sizeof(a)<<"\t"<<sizeof(pa)<<"\t"<<pa<<"\t"<<pa++<<endl;
	return 0;
}
运行结果
1       4       006FFBF7        006FFBF8
4       4       006FFBDC        006FFBE0
请按任意键继续. . .

测试代码中,定义了两种类型的指针,变量所占字节,int为4个字节,char为1个字节,但指针所占字节一样都为4,不同的是指针递增,int类型指针++是原地址加上4,char类型是加上1,分别为对应类型的长度。

上面代码中cout输出char类型指针时,要在前面加(void ),不然会输出乱码,不然就用printf("%p\n", pc)来输出。之所以要用(void )是因为char,在cout的重载重当做字符串来处理的,遇到\0就结束,所以要强制类型转换(void

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!