C (数据类型*)0的含义是什么

C (数据类型*)0的含义是什么,c,C,我经历过 但无法理解(int*)0或(int*)1000的含义 它告诉编译器什么?为什么要给它们添加一个?你能详细说明一下吗 (int*)0表示“将0视为整数的地址”。向其中添加一个将获得内存中“下一个”整数的地址。因此,将结果转换回整数可以得到整数的大小 但是,这依赖于未定义的行为,因此不应使用它。(int*)0表示“将0视为整数的地址”。向其中添加一个将获得内存中“下一个”整数的地址。因此,将结果转换回整数可以得到整数的大小 但是,这依赖于未定义的行为,因此您不应该使用它。这只是创建一个指向

我经历过

但无法理解
(int*)0或(int*)1000的含义

它告诉编译器什么?为什么要给它们添加一个?你能详细说明一下吗

(int*)0
表示“将0视为整数的地址”。向其中添加一个将获得内存中“下一个”整数的地址。因此,将结果转换回整数可以得到整数的大小

但是,这依赖于未定义的行为,因此不应使用它。

(int*)0
表示“将0视为整数的地址”。向其中添加一个将获得内存中“下一个”整数的地址。因此,将结果转换回整数可以得到整数的大小


但是,这依赖于未定义的行为,因此您不应该使用它。

这只是创建一个指向地址0的指针。 向其添加1不会增加指针的增量。 这会使地址随着数据类型的大小而前进。
在本例中,size将包含类X的大小,因为指针将按类X的大小前进,并且初始指针值为零。

这只是创建一个指向地址0的指针。 向其添加1不会增加指针的增量。 这会使地址随着数据类型的大小而前进。 在本例中,size将包含类X的大小,因为指针将前进类X的大小,并且初始指针值为零

理解
(int*)0
(int*)1000
的含义

这些只是类型转换,与这里的第二行完全相同:

int a = 25;
short b = (short)a;
a
强制转换为
short
允许您将值分配给
b
,该值被键入为
short
。这与
(int*)0
是一样的——您只是告诉编译器将
0
视为指向
int
的指针

关于强制转换,本质上你是在告诉编译器:“听着,我知道我在做什么,所以照我说的去做,不要再抱怨类型不匹配了。”这意味着你真的需要知道你在做什么,以及最终代码的效果如何。任何包含表达式(如
(int*)1000
)的代码都可能是a)高度可疑的,b)非常依赖于编译器和编写代码的平台的细节。在某种嵌入式系统中,它可能是有意义的,因为您可以控制整个系统,所以您可以非常确定内存位置1000处会发生什么。一般来说,您应该避免这样的代码

理解
(int*)0
(int*)1000
的含义

这些只是类型转换,与这里的第二行完全相同:

int a = 25;
short b = (short)a;
a
强制转换为
short
允许您将值分配给
b
,该值被键入为
short
。这与
(int*)0
是一样的——您只是告诉编译器将
0
视为指向
int
的指针


关于强制转换,本质上你是在告诉编译器:“听着,我知道我在做什么,所以照我说的去做,不要再抱怨类型不匹配了。”这意味着你真的需要知道你在做什么,以及最终代码的效果如何。任何包含表达式(如
(int*)1000
)的代码都可能是a)高度可疑的,b)非常依赖于编译器和编写代码的平台的细节。在某种嵌入式系统中,它可能是有意义的,因为您可以控制整个系统,所以您可以非常确定内存位置1000处会发生什么。一般来说,您应该避免这样的代码。

它只是将whatever数字作为int地址或您想要的地址。加号只移动地址。你也可以加500,也可以得到同样的结果。@Flo:我知道500也可以,结果是2000。但是如何乘以500*4呢?每个指针有4个字节长。所以当你有(int*)500,它就变成了2000。如果您有(char)500,它将保持为500,因为char类型只有一个字节长。它只是将whatever数字作为int或任何您想要的地址。加号只移动地址。你也可以加500,也可以得到同样的结果。@Flo:我知道500也可以,结果是2000。但是如何乘以500*4呢?每个指针有4个字节长。所以当你有(int*)500,它就变成了2000。如果您有(char)500,它将保持为500,因为char类型只有一个字节长。假设一个整数位于位置0,那么添加1将为您提供下一个整数的地址有什么保证?因为我们永远不知道下一个存储整数或字符的位置,所以
(size_t)((1+((X*)0))-((X*)0))
会是更好的选择吗?我的意思是,仅次于
sizeof(X)
?@RasmiRanjanNayak:
T*p;p=p+1
T*p相同;p=(T*)((char*)p+1)@dasblinkenlight:我不知道。为什么会更好呢?我知道它不保证产生
sizeof(X)
,但是什么使它未定义,而不仅仅是未指定?假设一个整数位于位置0,那么通过添加1,它将为您提供下一个整数的地址的保证是什么?因为我们永远不知道下一个存储整数或字符的位置,所以
(size_t)((1+((X*)0))-((X*)0))
会是更好的选择吗?我的意思是,仅次于
sizeof(X)
?@RasmiRanjanNayak:
T*p;p=p+1
T*p相同;p=(T*)((char*)p+1)@dasblinkenlight:我不知道。为什么会更好呢?我知道它不能保证产生sizeof(X)
,但是