为什么要添加地址?
Why would you add to an address?
我正在学习数据结构课程,我们的期中考试即将到来,我们的练习期中考试询问每一行是否是有效语法:
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。)
我正在学习数据结构课程,我们的期中考试即将到来,我们的练习期中考试询问每一行是否是有效语法:
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。)