你为什么要加地址?

时间:2015-10-16 21:10:54

标签: c++ pointers pointer-arithmetic addressing

我在数据结构课程中,我们的期中考试即将开始,我们的练习期中考试是否每一行都是有效的语法:

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。

这会对编码有什么作用?

2 个答案:

答案 0 :(得分:3)

在这种情况下,这将导致未定义的行为。它将解决内存中num之后的int,但没有明确的方法来说明它会是什么。尽管如此,它仍然是有效的语法。

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

答案 1 :(得分: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。)