指针如何知道项目的基础大小?

Naf*_*Kay 4 c pointers

正如" 指针增量如何工作? "中所述,我有一个后续问题.

指针如何知道它指向的数据的基础大小?指针存储基础类型的大小,以便他们知道如何增加?

我希望以下代码将指针向前移动一个字节:

int intarr[] = { ... };
int *intptr = intarr;
intptr = intptr + 1;
printf("intarr[1] = %d\n", *intptr);
Run Code Online (Sandbox Code Playgroud)

根据链接网站上接受的答案,指针按字节增量而不是sizeof指向元素的底层将导致大规模的歇斯底里,混乱和混乱.

虽然我知道这可能是一个不可避免的结果,但我仍然不明白指针在这方面是如何工作的.我不能声明一个void指向某个struct[]类型数组的指针,如果我这样做了,void指针如何知道增量sizeof(struct mytype)


编辑:我相信我已经解决了我所遇到的大部分困难,但就代码中的演示而言,我并不完全正确.

见这里:http://codepad.org/0d8veP4K

#include <stdio.h>

int main(int argc, char *argv[])
{ 
    int intarr[] = { 0, 5, 10 };
    int *intptr = intarr;

    // get the value where the pointer points
    printf("intptr(%p): %d\n", intptr, *intptr);
    printf("intptr(%p): %d\n", intptr + 1, *(intptr + 1));
    printf("intptr(%p): %d\n", intptr + 2, *(intptr + 2));

    // the difference between the pointer value should be same as sizeof(int)
    printf("intptr[0]: %p | intptr[1]: %p | difference: %d | expected: %d",
        intptr, intptr + 1, (intptr + 1) - intptr, sizeof(int));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

chu*_*ica 5

它在类型声明中. p1知道类型的大小,因为它是sizeof(*p1)sizeof(int). p2不知道sizeof(void)是不是没有定义.

int *p1; 
void *p2;

p1++;  // OK
p2++;  // Not defined behavior in C
Run Code Online (Sandbox Code Playgroud)