0

我正在上数据结构课程,我们的期中考试即将到来,我们的练习期中考试询问每一行是否是有效的语法:

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 ********

所以最后两行代码,据我所知,将 1 加到 num 变量的地址。

这在编码中有什么目的?

4

2 回答 2

3

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

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

于 2015-10-16T21:16:49.493 回答
0

这在编码中的一个目的是编写测试,例如:

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 。)

于 2015-10-16T22:29:53.450 回答