C int*常量的转换 #包括 main(){ int*i,*j; i=(int*)60; j=(int*)20; printf(“%d\n”,i-j); }

C int*常量的转换 #包括 main(){ int*i,*j; i=(int*)60; j=(int*)20; printf(“%d\n”,i-j); },c,pointers,C,Pointers,这段代码的输出是什么?我在指针方面做了很多工作,但从未遇到过这样的代码。这是未定义的行为,因为您正在减去不指向同一数组对象的指针 减去两个指针后,两个指针都应指向 相同的数组对象,或超过数组最后一个元素一个 对象结果是 两个数组元素 由于其他原因,它也可能是未定义的行为,例如使用指向无效对象的指针 我得到了10个…但不知道怎么做 撇开未定义的行为不谈,如果机器上的sizeof(int)是4,那么地址20和60之间确实有10个整数。这就是指针减法所给出的:元素数量的差异 如teppic所述,您的

这段代码的输出是什么?我在指针方面做了很多工作,但从未遇到过这样的代码。

这是未定义的行为,因为您正在减去不指向同一数组对象的指针

减去两个指针后,两个指针都应指向 相同的数组对象,或超过数组最后一个元素一个 对象结果是 两个数组元素

由于其他原因,它也可能是未定义的行为,例如使用指向无效对象的指针

我得到了10个…但不知道怎么做

撇开未定义的行为不谈,如果机器上的
sizeof(int)
是4,那么地址
20
60
之间确实有10个整数。这就是指针减法所给出的:元素数量的差异



teppic
所述,您的printf是错误的。两个指针之间的差异是
ptrdiff\u t
。格式应该类似于
%td

这是未定义的行为,因为您正在减去不指向同一数组对象的指针

减去两个指针后,两个指针都应指向 相同的数组对象,或超过数组最后一个元素一个 对象结果是 两个数组元素

由于其他原因,它也可能是未定义的行为,例如使用指向无效对象的指针

我得到了10个…但不知道怎么做

撇开未定义的行为不谈,如果机器上的
sizeof(int)
是4,那么地址
20
60
之间确实有10个整数。这就是指针减法所给出的:元素数量的差异



teppic
所述,您的printf是错误的。两个指针之间的差异是
ptrdiff\u t
。格式应该类似于
%td

既不是空指针也不指向有效对象的指针是无效指针。无效指针的任何使用,如读取其值,都是未定义的行为。

既不是空指针也不是指向有效对象的指针是无效指针。任何使用无效指针的行为,如读取其值,都是未定义的行为。

您应该始终从
main
显式返回某些内容。您肯定有一个过于宽松的编译器。您是否已将所有警告级别切换到最大值?对于gcc,这将是
-Wall
,例如,这不是
main
的正确声明,两个指针之间的差异通常不是
int
。它的类型为
ptrdiff\u t
,通常可以是
长的
。如果您的编译器不支持“%td”,请使用“%ld”作为格式,并强制转换指针差的结果,
(long)(i-j)
。您应该始终从
main
显式返回某些内容。您的编译器显然过于宽松。您是否已将所有警告级别切换到最大值?对于gcc,这将是
-Wall
,例如,这不是
main
的正确声明,两个指针之间的差异通常不是
int
。它的类型为
ptrdiff\u t
,通常可以是
长的
。如果您的编译器不支持“%td”,请使用“%ld”作为格式,并强制转换指针差的结果,
(long)(i-j)
。尽管未定义“%td”,但它在大多数计算机上都可以工作,因为数组元素一个接一个地存储在内存中。编译器知道int有多大,只是假设内存地址是指向数组部分的有效指针。printf()函数是错误的,因为您正在将指针打印为%d。您的意思可能是
%td”
ptrdiff\u t
显然是有符号的。@cnicutar:ptrdiff\u t是什么?什么是#t.#include main(){int a[3][2][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};printf(“%d\n”,***a+1));}这个的输出是什么???.非常棘手…虽然它没有定义,但它在大多数机器上都能工作,因为数组元素一个接一个地存储在内存中。编译器知道int有多大,只是假设内存地址是指向数组部分的有效指针。printf()函数是错误的,因为您正在将指针打印为%d。您的意思可能是
%td”
ptrdiff\u t
显然是有符号的。@cnicutar:ptrdiff\u t是什么?什么是#t.#include main(){inta[3][2][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};printf(“%d\n”,***a+1));}这个的输出是什么???。非常棘手的。。。
#include <stdio.h>

main() {
  int *i,*j;
  i = (int *) 60;
  j = (int *) 20;
  printf("%d\n", i - j);
}