#include <stdio.h>
int j;
int *ptr;
int main(void)
{
j = 13232323;//adress I want to assign
ptr = j;//assign the adress to the pointer
printf("%d",ptr);
}
输出:13232323
我是否错误地将地址直接分配给指针?指针只是一个变量包含地址形式的值,所以我构造了一个地址,然后将它分配给指针,它按原样应用,除了我不能构造一个包含字符ABCDEF的地址,所以,什么是int和指针之间的最大区别?
编辑: 此代码仅代表测试目的
答案 0 :(得分:6)
实际上你的尝试是出于你的渴望。我同意,我经常这样做。
首先,如果你将13232323
存储在一个指针变量中,它的十六进制值是OXC9E8C3
。所以在你指定指针变量(ptr)的时候真的不知道是否真的是有效地址或无效地址。但是,当您使用*ptr
取消引用此地址时,就会出现问题。它试图在地址中寻找价值。
然后有2个案例..
所以,即使您的程序编译,运行,直到并且除非您在ptr
中存储有效地址。ptr
没有用。
你的问题:除了我无法构建一个问题之外,它的工作方式也是如此 包含字符ABCDEF的地址,那么,有什么大的区别 int和指针之间?的printf( “%d”,PTR);
我认为你在问,无论如何,我都无法存储ABCDEF,因此ptr
的工作方式与int type
相同,那么整数和指针有什么区别?
这是:
%d
打印地址,尝试使用%x
或%p
进行打印。 Atlast,您是否注意到编译器警告warning: assignment makes pointer from integer without a cast
,因为ptr = j;
中的ptr
属于int*
类型,而j
属于int
1}}类型。
答案 1 :(得分:4)
您需要使用%x
,或者您可以将*ptr
发送到printf
printf("%d", *ptr);// if you are using this you need to know what are you pointing at, and that it will be an integer
或
printf("%x", ptr);
正如下面的评论所说,使用%p
代替%x
总是更好,因为%x
会调用未定义的行为。使用%p
时,应将指针投向(void *)
答案 2 :(得分:2)
您的代码无效。 C语言不允许此作业
ptr = j;
如果没有显式转换,则无法将整数值转换为指针类型(常量零是唯一的例外)。
如果编译器接受了代码,则只是意味着编译器将语言扩展到其正式范围之外。许多编译器以这种或那种方式做到这一点。但是,如果编译器接受此代码而未发出诊断消息(警告或错误),则编译器会严重损坏。
换句话说,我们程序的行为很少(或没有)与C语言有关。
答案 3 :(得分:2)
在C语言中,您可以进行大部分类型转换,即使类型完全不相关。但它可能会引起警告。确保您的类型转换有意义。
答案 4 :(得分:1)
从句法上讲,你在这里没有做错任何事。无论如何,你可以指定一个指向另一个的指针,因为它们只包含你在这里分配的地址,这就是指针赋值期间实际发生的情况。
但是你永远不应该分配一个随机地址并尝试取消引用它,因为除非机器分配,否则你的程序无法访问内存位置。您应该使用类似malloc()的函数从机器请求内存
至于指针和整数之间的差异,最大的一个是你can't use a dereference operator (*) on an integer
访问它包含的地址的值。
并can construct addresses using ABCDEF
为地址值添加前缀0X
或0x
,以表示十六进制表示法。
答案 5 :(得分:1)
是的,唯一可以直接使用指针的整数类型是intptr_t
和uintptr_t
,如果它们存在的话。如果它们不存在,你根本就不应该这样做。即使这样,你也必须使用显式转换进行转换。
不,在某些架构上,指针可能比这更复杂。存储器可以例如被分段,因此将存在对该段进行编码的指针值的一部分以及对该段中的偏移进行编码的另一部分。现在这种架构很少见,但这仍然是C标准所允许的。
答案 6 :(得分:0)
你需要ptr通过执行以下操作来保存j的地址
ptr = &j;
ptr hold,等于j的地址
并且您想要打印ptr指向的内容,具体如下
printf("%d",*ptr);
并获取ptr的地址执行以下操作
printf("%x",ptr);
x表示十六进制表示