C语言中与指针运算有关的内存

C语言中与指针运算有关的内存,c,pointers,math,heap-memory,C,Pointers,Math,Heap Memory,我目前正在读一本关于C指针的书,书中有一个例子让我感到困惑: 假设我们有:intarruofint[]={5,10,15} 我们设置:int*add\u of\u arr=arr\u of\u int 然后我知道“add_of_arr”变量包含以下地址:arr_of_int[0] 让我们假设“add\u of_arr”的地址是500 现在,如果我这样做:“add\u of_arr+=3;”,那么“add\u of_arr”的地址现在是512?这就是我从书中得到的,但是“add_of_arr”的地

我目前正在读一本关于C指针的书,书中有一个例子让我感到困惑:

假设我们有:
intarruofint[]={5,10,15}
我们设置:
int*add\u of\u arr=arr\u of\u int

然后我知道“
add_of_arr
”变量包含以下地址:
arr_of_int[0]
让我们假设“
add\u of_arr
”的地址是500

现在,如果我这样做:“
add\u of_arr+=3;
”,那么“add\u of_arr”的地址现在是512?这就是我从书中得到的,但是“
add_of_arr
”的地址不应该仍然是500,而add_of_arr持有的地址应该是512吗?我从这本书中得到的是,add_of_arr的地址正在改变。这使我困惑。我想这是个错误,但我不确定


谢谢

这是一个输入错误:arr的add\u中的address现在是512,但是addr的add\u的address没有改变。

你混淆了两件事:指针是存储内存的变量 地址。作为一个变量,它在内存中也有自己的地址。正如你所说的,让这是500。 表达式
add_of_arr=arr_of_int
因此复制
将int[0]的数组放入内存位置500。现在假设,
arr\u of_int
位于
内存位置400。然后
add_of_arr=arr_of_int
将400存储到内存位置500中。在
add_of_arr+=3
之后,内存位置500处的指针包含412。然而,
add\u of_arr
(通过
&add\u of_arr
获得)的地址仍然是500,但其值(通过
add\u of_arr
获得)已从400更改为412。

您为什么关心地址的地址?是的,这是一个很好的定义,是的,在某些情况下,这甚至是有用的,但你还没有做到。特别是,你似乎在谈论
int**add_of_add_of_arr=&add_或_arr
500。我不明白为什么“&add_of_arr”在变化而不是“add_of_arr”,但这看起来像是一个打字错误。完全按照所写的阅读我们的假设,你是对的,而这本书是错的。好样的!也许你应该找一本更好更精确的书。只是:
int
不能保证有4个字节。它可以是1(!)中的任意大小。另外,如果
addr
(使用更好的名称!)的地址是
500
,那么
数组的地址也不能是
500
,因此递增后的值不能是
512
(假设
sizeof(int)=4U
)!看起来这本书的作者很困惑。OP是正确的!