为什么我不能做*值++;将 1 递增到该内存位置中的值?
Why can't I do *value++; to increment one to the value in that memory location?
我知道要让它工作,它需要
void increment(int *value)
{
(*value)++;
}
这是因为它需要括号,因为优先级是如何工作的(如果我错了,请纠正我)。但是,当我执行以下操作时,为什么不会发生编译错误呢?由于没有括号,该值没有改变,这是意料之中的事,但这到底在改变什么?
void increment(int *value)
{
*value++;
}
value
是一个指向整数的指针。指针算术的规则说,如果你做一个像value++
这样的运算,那么之后它将指向value + sizeof(int)
(以字节为单位)。
这里发生的情况是,您将取消引用value
以获得一些右值,然后递增value
(不是它指向的东西,而是指针本身)。
*value++;
它取消引用value
所指向位置的值,并由于后增量而增加指针value
。实际上,它与value++
相同,因为您正在丢弃表达式返回的值。
But how come when I do the following, no compile error happens?
因为这是一个有效的语句,而您只是在丢弃表达式返回的值。同样的方式,你可以有这样的语句:
"Random string";
42;
它们是有效的,可以编译得很好(但毫无用处)。
我们丢弃了许多标准库函数的返回值。例如,memset()
将void *
返回到设置的内存,但我们很少使用它。这不是很直观,但它是完全有效的。
根据操作员的优先级,
++
先于*
因此,它被执行为
value++
和*
。实际上,*(value++)
value++
将向您返回value + (size of datatype pointed at)
的地址,即本例中的value + (size of int)
。
除非你的value
指向一个数组,否则你可能正在获取一个垃圾值并取消对它的引用
而不是确切的答案:来自K&RC这就是memcopy的实现方式。如果你了解正在发生的事情,你就能够自己回答你的问题。
void *memcpy(char *ptr1, char *ptr2, size_t n) {
void *ret = ptr1;
while (n >0) {
*ptr1++ = *ptr2++;
n--;
}
return ret;
}
相关文章:
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 向量的内存位置不连续
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 常量引用的内存位置
- C++强制变量到一个固定的内存位置
- 为什么未初始化的内存位置的值给出 -842150451 的值?
- 为什么存储在内存位置的值会发生变化?
- 在特定内存位置构造 c++ 对象
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 内存位置出现Microsoft C++异常:std::out_of_range
- 函数,返回变量c++占用的内存位置的大小
- 无法在 Opencv 中显示图像导致内存位置
- 从十六进制到双的转换始终导致内存位置的 std::out_of_range
- 错误 在测试.exe 0x76C9FD62时出现未经处理的异常:Microsoft C++异常:内存位置0x006FF8
- 错误:内存位置的 std::length_error
- C++不同内存位置中的默认数组值
- 为什么动态分配的两个变量的内存位置不是连续的?
- Boost.进程间内存位置
- 查找编译时构造类的内存位置