C语言寻址

C语言寻址,c,C,显然,上述情况不会发生,因为我们可以在输出的前两行看到,地址只增加了1,而在第二种情况下增加了4。另外,请解释&返回可以分配给其他变量(如int)的地址,或者它本身是一个指针,只能分配给指针类型 键入“数字”赋值,然后像这样尝试 5da24540 5da24541 5da24540 5da24544 这将起作用。number是一个int,用x地址初始化(从地址“不强制转换”生成int)-警告告诉您,这可能不是您想要的)-如果您增加它,它将增加1 pointer2是指向int(使用相同的x地址初

显然,上述情况不会发生,因为我们可以在输出的前两行看到,地址只增加了1,而在第二种情况下增加了4。另外,请解释&返回可以分配给其他变量(如int)的地址,或者它本身是一个指针,只能分配给指针类型

键入“数字”赋值,然后像这样尝试

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;