C中的指针算法加减错误

时间:2015-10-09 21:18:37

标签: c pointers pointer-arithmetic

现在我有一个像这样的指针算法的代码

var1 + sizeof(structA)

Var1是一个指针,structA是一个sizeOf为4个字节的结构。问题是,当我这样做时,地址被移动了16个字节而不是4.我发现问题是因为在C中,即使我输入它实际上是

var1 + sizeof(structA) * sizeof(int)

因为int是sizeof的返回。有没有办法解决这个问题? 对于类似的问题,我正在做

var1 - sizeof(structA)

但它不是向上移动16个字节,而是向上移动32个字节,因此0x10000032变为0x10000000。

有谁知道如何解决这个问题?

谢谢!

3 个答案:

答案 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]。编译器根据指针类型自动识别数组的bytelong的实际大小。

因此,向指针添加整数值对应于通过指示的数量的元素移动指针(具有指针类型已知的元素的大小),而不是指定的数字内存中的字节数 类似地,从指针值中减去一个整数值会产生一个指针移动给定的个项目数(而不是字节)。