代码之家  ›  专栏  ›  技术社区  ›  karafar

字节级整数和无符号long的解释

c
  •  -1
  • karafar  · 技术社区  · 7 年前

    指针的值是变量的地址。为什么 int pointer 在int指针增加1之后增加了4个字节。

    在我看来,指针的值(变量的地址)只会在指针递增后增加1个字节。

    测试代码:

    int a = 1, *ptr;
    ptr = &a;
    printf("0x%X\n", ptr);
    ptr++;
    printf("0x%X\n", ptr);
    

    预期产量:

    0xBF8D63B8
    0xBF8D63B9
    

    实际输出:

    0xBF8D63B8
    0xBF8D63BC
    

    编辑 :

    另一个问题-如何访问4字节 int 一个接一个占用?

    0 回复  |  直到 7 年前
        1
  •  97
  •   Community Mohan Dere    9 年前

    当你增加一个 T* 它移动 sizeof(T) 字节。 阿西 这是因为移动任何其他值都没有意义:如果我指向 int 这是4个字节的大小,例如,不到4的增量会给我留下什么?部分 int 与其他数据混合:荒谬的。


    记住这一点:

        [↓      ]
    [...|0 1 2 3|0 1 2 3|...]
    [...|int    |int    |...]
    

    当我增加指针时,哪个更有意义?这是:

                [↓      ]
    [...|0 1 2 3|0 1 2 3|...]
    [...|int    |int    |...]
    

    或者:

          [↓      ]
    [...|0 1 2 3|0 1 2 3|...]
    [...|int    |int    |...]
    

    最后一个并没有指出 int . (从技术上讲,使用指针是 UB )

    如果你 真的? 要移动一个字节,请增加一个 char* :的大小 char 总是一个:

    int i = 0;
    int* p = &i;
    
    char* c = (char*)p;
    char x = c[1]; // one byte into an int
    

    由此推论,你不能增加 void* ,因为 void 是不完整的类型。

        2
  •  8
  •   kqnr    15 年前

    指针增量基于指向的类型的大小。如果int是4个字节,则将int*递增1将使其值增加4。

    如果short是2字节,将short*递增1将使其值增加2。

    这是C指针算法的标准行为。

        3
  •  2
  •   MByD    15 年前

    如果指针指向char, pointer++ 将指针递增1,如果它指向1234字节的结构, 指针+ 将指针递增1234。

    第一次遇到它时可能会感到困惑,但实际上这很有意义,这不是一个特殊的处理器特性,而是编译器在编译期间计算出来的,所以当您编写 pointer+1 编译器将其编译为 pointer + sizeof(*pointer)

        4
  •  1
  •   Pablo    15 年前

    其思想是,递增之后,指针指向内存中的下一个int。因为int是4字节宽的,所以它会增加4字节。通常,指向类型t的指针将增加sizeof(t)

        5
  •  1
  •   Amir Rachum    15 年前

    正如你所说,一个 int pointer 指向一个 int . 安 int 通常需要4个字节,因此当您增加指针时,它指向“下一个” int 在内存中-即增加4个字节。它的作用是这样的任何大小的类型。如果有指向类型的指针 A ,然后递增 A* 它将增加 sizeof(A) .

    考虑一下-如果指针只增加1个字节,那么它将指向 int 我想不出有这样的机会。

    例如,当迭代数组时,这种行为非常舒适。

        6
  •  0
  •   Paolo    7 年前

    指针指向内存中某物的开头。int占用4字节(32位),double占用8字节(64位)。因此,如果您存储了一个双精度数字,并且您希望在非常低的级别指向下一个可用的内存位置,那么指针wooud将增加8个字节。如果由于某种原因,您指向双精度值开头的+4字节,则会损坏它的值。内存是一个非常大的平面域,它本身没有良知,所以由软件来正确划分它,并“尊重”位于该域中的项的边界。