C语言寻址
显然,上述情况不会发生,因为我们可以在输出的前两行看到,地址只增加了1,而在第二种情况下增加了4。另外,请解释&返回可以分配给其他变量(如int)的地址,或者它本身是一个指针,只能分配给指针类型 键入“数字”赋值,然后像这样尝试C语言寻址,c,C,显然,上述情况不会发生,因为我们可以在输出的前两行看到,地址只增加了1,而在第二种情况下增加了4。另外,请解释&返回可以分配给其他变量(如int)的地址,或者它本身是一个指针,只能分配给指针类型 键入“数字”赋值,然后像这样尝试 5da24540 5da24541 5da24540 5da24544 这将起作用。number是一个int,用x地址初始化(从地址“不强制转换”生成int)-警告告诉您,这可能不是您想要的)-如果您增加它,它将增加1 pointer2是指向int(使用相同的x地址初
5da24540
5da24541
5da24540
5da24544
这将起作用。
number
是一个int
,用x
地址初始化(从地址“不强制转换”生成int
)-警告告诉您,这可能不是您想要的)-如果您增加它,它将增加1
pointer2
是指向int
(使用相同的x
地址初始化)的指针,它的增量为int
的大小(这种行为称为“指针算术”)。编译器不会将数字从int转换为指针。警告显示“从指针生成整数”,而不是“从整数生成指针”,因此number
仍然是int
。指针(x的地址)已被“转换”为纯整数。警告是因为此赋值:
int x = 2;
int *pointer2 = &x;
int number = (int)&x;
您正在将int*
分配给int
,这是您不应该做的。(1)将x
的值指定给number
,或(2)将number
的类型更改为int*
(链接指针2
)并指定x
的地址
或者(3)如果您确实想将x
的地址分配给number
使用类型转换
int number = &x;
你的第二个问题与指针运算有关 您的
number
变量是一个int
,这意味着如果您增加它(+1
),它实际上会增加1
您的指针2
变量是一个int*
,这意味着如果您增加它,它将增加int*
的大小(32位系统为4字节,64位系统为8字节)
这样就可以通过简单地递增指针来迭代指针数组
编译器发出警告的原因有两个:
1) 类型不匹配不是由编译器隐式处理的,因为标准是这样规定的。这是因为从指针类型转换到另一种类型有一个罕见的用例。像这样的大部分时间分配都是偶然完成的,作者只是把间接性的级别弄乱了(数量*
)
2) 标准禁止这样做的另一个原因是
int
是4字节(在大多数实现中),int*
可以是4或8字节,具体取决于编译的平台。您会收到警告,因为不能保证int
类型可以保存指针值(例如,您所在的系统中,int
为16位,但指针值为32位);如果添加强制转换,您会告诉编译器您知道自己在做什么(即使您不知道):
这告诉编译器,是的,您确实希望将x
的地址作为普通整数处理。请注意,存储到number
的值可能会被截断
也不能保证所有指针类型都具有相同的大小和表示形式;照此,指向int
的指针的大小可能不同于指向char
的指针,char的指针的大小可能不同于指向struct
的指针。在大多数现代桌面和服务器体系结构上,它们是相同的,但仍然存在一些奇怪的问题球就在他们不在的地方
至于为什么你在加法上得到不同的结果
向指针添加1将给出指向类型的下一个对象的地址;因此,如果您有指向int
的指针,则添加1将给出下一个可用int
的地址,即sizeof(int)
当前地址的字节。如果您有一个指向int
的10元素数组的指针,添加1将给出int
的下一个10元素数组的地址,即当前地址的10*sizeof(int)
字节
数组索引就是这样工作的。表达式
a[i]
被解释为*(a+i)
;也就是说,计算a
后面的i
第个元素的地址,并取消引用结果。得到的输出是正常的。如果将X添加到指向Y的指针,则将X*sizeof Y添加到指针。int的大小是4(至少在您的情况下是这样)因此,您得到的是5da24544而不是5da24540。&
运算符生成指针。指针的值称为地址。地址也可以被视为任意整数值,但通常不会对地址执行数字操作,除非是为了与检查地址的硬件接口在CPU核心一侧。so&x不仅返回x的地址,而且&x本身也是指针类型,即这里的int*?是的,&
获取变量的地址,并向类型添加一级间接寻址,即int*y=&x;int**z=&y;
等。(3)给出警告:警告:从指针强制转换为不同大小的整数,可能是因为sizeof(int*)是8字节,而sizeof(int)是我机器右侧的4个字节。要以整数类型安全地存储指针地址,请使用intptr\t
/uintpr\t
而不是int
。要做到这一点,您可能必须\35;包括。
int number = &x;
// (1)
int number = x; // Assign value of x.
// (2)
int* number = &x; // Assign address of x.
// (3)
int number = (int)&x; // Assign address of x and cast to int.
int number = (int) &x;