你为什么要在地址后面加上
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。)
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 为什么指针不写入类的地址?
- 为什么 ulimit -v 在 Clang 的地址清理器下不起作用?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 为什么未命名的结构内联变量在每个翻译单元中没有相同的地址?
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 为什么两个矢量元素的地址有这么大的差距?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 为什么同一个变量的内存地址不同?
- 为什么成员函数地址离自由函数这么远?
- 为什么我得到以下代码地址清理器:未知地址错误的SEGV
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 为什么每次执行时函数的地址都不同?
- 为什么地址相同?
- 为什么存储在数组中的地址值与其自己的地址相同,它应该指向某个不同的地址(&arr[0])?
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 为什么下面的代码段返回指针指向的值而不是指针的地址?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?