现在我有一个像这样的指针算法的代码
var1 + sizeof(structA)
Var1是一个指针,structA是一个sizeOf为4个字节的结构。问题是,当我这样做时,地址被移动了16个字节而不是4.我发现问题是因为在C中,即使我输入它实际上是
var1 + sizeof(structA) * sizeof(int)
因为int是sizeof的返回。有没有办法解决这个问题? 对于类似的问题,我正在做
var1 - sizeof(structA)
但它不是向上移动16个字节,而是向上移动32个字节,因此0x10000032变为0x10000000。
有谁知道如何解决这个问题?
谢谢!
答案 0 :(得分:4)
而不是使用if( event.getEventType() == MouseEvent.MOUSE_PRESSED ) {
this.mouseInSceneX = event.getSceneX();
this.mouseInSceneY = event.getSceneY();
Card.this.setCursor(Cursor.MOVE);
}
if( event.getEventType() == MouseEvent.MOUSE_DRAGGED ) {
double xChange = event.getSceneX() - mouseInSceneX;
double yChange = event.getSceneY() - mouseInSceneY;
setTranslateX(getTranslateX() + xChange);
setTranslateY(getTranslateY() + yChange);
mouseInSceneX = event.getSceneX();
mouseInSceneY = event.getSceneY();
System.out.print(" trX: " + Card.this.getTranslateX());
System.out.print(" trY: " + Card.this.getTranslateY());
System.out.print(" cgpX: " + mouseInSceneX);
System.out.print(" cgpY: " + mouseInSceneY);
System.out.println();
}
使用var1 + sizeof(structA)
定义指针运算,使指针的数值按对象类型的大小递增(和递减)。
因此,var1 + 1
的数值与var1+1
+ var1
的数值相同。
sizeof(*var1)
的数值与var1-1
- var1
的数值相同。
示例程序
sizeof(*var1)
<强>输出强>
#include <stdio.h>
struct FiftyBytes
{
char d[50];
};
struct FortyBytes
{
char d[40];
};
void test1()
{
struct FiftyBytes a[2];
struct FiftyBytes* var1 = a;
struct FiftyBytes* var2 = var1 + 1;
printf("var1: %p, var2: %p\n", var1, var2);
struct FiftyBytes* var3 = &a[1];
struct FiftyBytes* var4 = var3 - 1;
printf("var3: %p, var4: %p\n", var3, var4);
}
void test2()
{
struct FortyBytes a[2];
struct FortyBytes* var1 = a;
struct FortyBytes* var2 = var1 + 1;
printf("var1: %p, var2: %p\n", var1, var2);
struct FortyBytes* var3 = &a[1];
struct FortyBytes* var4 = var3 - 1;
printf("var3: %p, var4: %p\n", var3, var4);
}
int main()
{
test1();
test2();
}
如果检查指针值的差异,您会注意到:
var1: 0x22ca50, var2: 0x22ca82
var3: 0x22ca82, var4: 0x22ca50
var1: 0x22ca70, var2: 0x22ca98
var3: 0x22ca98, var4: 0x22ca70
答案 1 :(得分:1)
您可以执行以下操作
{{1}}
答案 2 :(得分:0)
在C中,表达式ptr + ival
,其中ptr
是指向T*
和T[]
类型数组的第n项的ival
指针,整数类型,按照定义指向同一数组的(n+ival)
项的指针(假设结果索引落在数组长度内)。
char b[7];
char *pb = &b[2];
char *qb = pb+3;
指针qb
指向b[5]
,而指针
long l[7];
long *pl = &l[2];
long *ql = pl+3;
指针ql
指向l[5]
。编译器根据指针类型自动识别数组的byte
项long
的实际大小。
因此,向指针添加整数值对应于通过指示的数量的元素移动指针(具有指针类型已知的元素的大小),而不是指定的数字内存中的字节数 类似地,从指针值中减去一个整数值会产生一个指针移动给定的个项目数(而不是字节)。