C - int * p是什么; P = 15;呢?

时间:2015-06-09 21:52:56

标签: c

这两个代码示例之间有什么区别?当我打印变量int *p; p = 51; printf("%d",p); 时,它会打印指定的值,如下所示。

p=15
  

输出:51

当我尝试分配p时,我是否在ram中将内存地址设置为“15”作为指针int c = 5 +p;的指针?当我尝试添加71时,它会将输出显示为int。为什么我得到71?

我认为内存地址“15”可以存储操作系统,程序等的任何信息。但它确实存储p = 150;以确保精确。虽然我更改了值int但它会items = Item.objects.filter(date_added__month=6, date_added__year=2015) dates = items.dates('date_added', 'day') # returns a queryset of datetimes days = [d.day for d in dates] # convert to a list of days 。怎么可能?引擎盖下发生了什么?!我真的不明白。

3 个答案:

答案 0 :(得分:5)

您的代码是非法的。形式上,它不是C. C语言禁止在没有显式强制转换的情况下为指针类型分配整数值(常量0除外)

你可以做到

p = (int *) 51;

(具有实现定义的效果),但你无法做到

p = 51;

如果您的编译器允许后一种变体,则它是一种特定于编译器的扩展,与标准C语言无关。

通常,此类分配会使p指向内存中的地址51

最重要的是,在%d中使用printf格式说明符打印指针值是违法的。在使用特定于整数的格式说明符之前,使用%p或将指针值转换为正确的整数类型。

答案 1 :(得分:0)

所以你告诉指针它指向0x15。然后,告诉printf将其打印为十进制整数,因此它将其视为十进制整数。

这个原因是在32位系统上,指针是4个字节,与int的大小相匹配。

答案 2 :(得分:0)

UPDATE my_table SET my_link = REGEXP_REPLACE( my_link, "http:\\/\\/www\\.example\\.com\\/(.*)", "http:\\/\\/www\\.example\\.com\\/#\\/results\\/\\1") WHERE my_link IS NOT NULL 指向记忆中的一个地方。 p是该空间的内容。但是你从不使用内容,只使用指针。

该指针只能被视为一个数字,因此*p有效。为其分配一个数字时,它会将其解释为内存中的偏移量(以字节为单位)。但是,指针应该包含printf("%d",p) s,并且当数字添加到指针时,指针会前进那么多空格。所以int意味着"指向超过你现在指向的那个空间的5个空格",对于4个字节的整数意味着20个字节,因此是71。

否则,你已经说过你有一个指向int的指针,但你实际上只是把你所有的东西都用在了指针上,而不是指向它的int。

如果你实际上把任何东西放到你所指的地方,你就会遇到各种各样的麻烦。您需要为它分配一些未使用的内存(例如使用p+5),然后使用malloc读取和写入该内存的值。