你为什么要在地址后面加上



我在上数据结构的课,期中考试就要到了我们的期中练习会问每行语法是否有效

int num = 10;
int *p, *q;
p = #
q = p;  //valid
*p = q; //invalid, int* cannot be assigned to int
(*p)++; //valid
&num+1; //valid ********
p++;    //valid ********

在我理解的最后两行代码中,num变量的地址加1

这在编码中有什么用途?

在这种情况下,这会导致未定义的行为。它将在内存中寻址num后面的int,但是没有定义的方法来告诉它是什么。尽管如此,它是有效的语法。

如果指针指向数组的元素而不是标量,则更有意义。在这种情况下,处理下一个int是合理的。但是在这两种情况下,语法都是有效的

这样做的目的是编写测试,如:

void f ( size_t length, int data[length] )
{
  assert( 0 == length % 4 );
  for ( int* p = data; p < data + length; p += 4 )
    do_stuff_with_subarray( p, 4 );
  return;
}

循环条件p < data + length通过将指针与数组结束后的地址进行比较来检查指针的边界。解引用这个地址将是未定义的行为,但比较它不是。(在这个简单的例子中,如果do_stuff_with_subarray()读取超过长度不能被4整除的数组的末尾,则会出现UB。)

相关内容

  • 没有找到相关文章

最新更新