这两个代码示例之间有什么区别?当我打印变量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
。怎么可能?引擎盖下发生了什么?!我真的不明白。
答案 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
读取和写入该内存的值。