在我读过的K& R电子书中,我看到了这段代码:
我关心的是:
allocbuf + ALLOCSIZE - allocp >= n
代码获取缓冲区开始和计算的地址,使用指向其自身的指针索引以及上面定义的最大缓冲区长度常量,即剩余的总分配。
现在,据我所知,如果你要定义一个字符指针,那么就算是将算术递增一个:
char *ptr = "array";
ptr++;
然后你会在记忆中得到第二个位置'r'。在内存中,实际上按sizeof(char)单位递增。
因此,假设数组在指针的幌子下运行:
allocbuf + 10000
数组中最后分配的插槽是否正确?由于指针的类型为char,因此稍后10000个“槽”实际上是10,000 * sizeof(char)槽。
为了澄清这个概念,在给定随机存储器地址4210720的情况下,4210721是否表示通过地址的位,字节或其他某些元素?
那是:
void *ptr = "sherrellbc";
ptr++;
ptr现在在哪里?它是在's'和'h'之间的某个指针,因为void类型没有提供有关步长的信息(例如,char指针会增加sizeof(char))。
本质上,使用什么度量标准存储?比特字节,半字节等?
答案 0 :(得分:2)
内存地址是您可能使用的每台计算机上的字节地址,即使是那些没有字节级内存操作的计算机。有些编译器定义将void *
递增为向指针添加一个,但它不可移植。
答案 1 :(得分:1)
取消引用void指针本质上是未定义的。 如果定义了类型,则增量始终为
ptr+1 = next address of ptr type.
答案 2 :(得分:1)
allocbuf + 10000
数组中最后分配的插槽是正确的吗?
这是一个结束。
为了澄清这个概念,在给定随机存储器地址4210720的情况下,4210721是否表示通过地址的位,字节或其他某些元素?
字节(3.6):
“可寻址的数据存储单元,足以容纳任何成员 执行环境的基本字符集。
注1:可以表示对象的每个字节的地址 唯一“。
最后,
void *ptr = "sherrellbc"; \n ptr++;
- ptr现在在哪里?
void*
上的算术是非法的。不要使用它;)这就像要求编译器获取变量所持的地址并向其添加sizeof(void)
。
如果必须达到此目的,请改用char*
。