在我看过的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)递增) .
从本质上讲,使用什么度量标准存储?比特字节,半字节等?
3 回答
内存地址是每台计算机上的字节地址,您必须具有字节级内存操作 . 有些编译器定义将
void *
递增为向指针添加一个,但它不可移植 .取消引用void指针本质上是未定义的 . 如果定义了类型,则增量将始终为
这是一个结束 .
一个字节(3.6):
最后,
void*
上的算术是非法的 . 唐't use it ;) It'就像要求编译器获取变量所持有的地址并向其添加sizeof(void)
.如果必须归结为此,请改用
char*
.