C-什么是int*p;p=15;做
这两个代码示例之间的区别是什么?当我打印变量C-什么是int*p;p=15;做,c,C,这两个代码示例之间的区别是什么?当我打印变量p时,它会打印指定的值,如下所示 int *p; p = 51; printf("%d",p); 产出:51 当我尝试分配p=15时,我是否将ram中的内存地址“15”作为指向指针p的指针对象?当我尝试添加intc=5+p时它以71的形式给出输出。为什么我得了71分 我认为内存地址“15”可以存储操作系统、程序等的任何信息,但为了精确起见,它准确地存储了int。虽然我改变了值p=150它给出int。这怎么可能?引擎盖下发生了什么?!我真的不明白。所以
p
时,它会打印指定的值,如下所示
int *p;
p = 51;
printf("%d",p);
产出:51
当我尝试分配p=15
时,我是否将ram中的内存地址“15”作为指向指针p
的指针对象?当我尝试添加intc=5+p时代码>它以71
的形式给出输出。为什么我得了71分
我认为内存地址“15”可以存储操作系统、程序等的任何信息,但为了精确起见,它准确地存储了int
。虽然我改变了值p=150代码>它给出int
。这怎么可能?引擎盖下发生了什么?!我真的不明白。所以你告诉那个指针它指向0x15。然后,您告诉printf将其打印为十进制整数,因此它将其视为十进制整数
之所以这样做,是因为在32位系统上,指针是4个字节,与int的大小相匹配。p
指向内存中的某个位置*p
是该空间的内容。但你从不使用内容,只使用指针
该指针可以看作只是一个数字,因此printf(“%d”,p)
可以工作。当您为其分配一个数字时,它会将其解释为内存中的偏移量(以字节为单位)。但是,指针应该包含int
s,当您向指针添加一个数字时,指针前进了那么多空格。因此p+5
意味着“指向你现在指向的整数后面的整数5个空格”,这对于4字节整数意味着20字节之后,因此是71字节
否则,你说你有一个指向int的指针,但实际上你只是在对指针做所有的事情,而不是它指向的int
如果你真的在你指的地方放东西,你会遇到各种各样的麻烦。您需要为它分配一些未使用的内存(例如,使用malloc
),然后使用*p
将值读写到该内存中。您的代码是非法的。从形式上讲,它不是C语言。C语言禁止在没有显式转换的情况下将整数值赋给指针类型(常量0
除外)
你能行
p = (int *) 51;
(具有实现定义的效果),但您不能这样做
p = 51;
如果编译器允许后一种变体,则它是编译器特定的扩展,与标准C语言无关
通常,这种赋值使p
指向内存中的地址51
除此之外,在printf
中使用%d
格式说明符打印指针值是非法的。在使用特定于整数的格式说明符之前,请使用%p
或将指针值强制转换为正确的整数类型。实际上,int c=5+p
正在使用%d
打印指针是错误的。指针是int
以外的“其他东西”。对于这3行代码,我得到了两个(严重的)警告。因此,我可以使用printf(“%d”,*p)打印第71个空格的值吗代码>?@EugeneSh.-是的,但是OP想知道为什么他们的代码会这样做,我的回答解释了这一点。仅仅因为它没有被某些标准定义,并不意味着你不能理解它为什么在你的情况下会这样做“代码>有效,并且会导致未定义的行为。@哈里什:抱歉,但你不能。再来一次:如果编译器允许您这样做,它是一个与标准C无关的编译器扩展。在任何情况下,将整数值转换为指针类型本身都会导致实现定义的行为,而不是未定义的行为。因此,如果我想知道内存地址15
中有什么内容,我可以使用printf(“%p”,*p)打印它吗代码>?我只是出于好奇才想知道。@harish:嗯,大多数时候它都不起作用。首先,在现代操作系统中,通过这样做,您试图访问进程虚拟地址空间中的地址15
。其次,如果此地址不属于您拥有的某个有效内存块,尝试读取此内存位置将触发内存保护并使程序崩溃。