Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-什么是int*p;p=15;做_C - Fatal编程技术网

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
。其次,如果此地址不属于您拥有的某个有效内存块,尝试读取此内存位置将触发内存保护并使程序崩溃。