指针所占大小与偏移之间的关系(求助)

指针所占大小由计算机位数决定,与其指向的数据类型无关,P++是指针偏移到其指向位置的下一个内存单元。假如我定义int arr[]={0,1,2,3,4,5,6,7,8,};int *p=arr;那么对利用p++可以遍历数组,p占四个字节,int也占4个字节。但是假如double arr={0,1,2,3,4,5,6,7,8,},按照我的理解,应该会出错呀,double占8个字节,而p++只偏移了四个字节呀。

c++·c
134 views
Comments
登录后评论
Sign In
·

p++不是偏移它自己的长度,你不是给p类型了么,他偏移的是你给的类型的长度

而且指针所占大小不完全由计算机位数决定,我在64位的系统上也可以编译32位的程序,这样指针的位数不就已经不一样了,比较准确的讲法是和寻址位数有关

·

你要是想知道代码到底干了什么可以用Compiler Explorer (godbolt.org)查看反汇编的结果

int的p++:add     QWORD PTR [rbp-8], 4

double的p++:add     QWORD PTR [rbp-16], 8

·

在64位机上用32位gcc编译指针大小是4个字节,而64位gcc编译指针大小是8个字节。

指针的加减操作和它指向的类型有关。比如他如果指向一个一字节的数据,那么加减操作是以一字节为单位的,比如如下代码输出是99

#include <iostream>

int main() {
    char a[100];
    char *p1 = a;
    char *p2 = &a[99];
    std::cout << p2 - p1;
    return 0;
}

而下面代码输出是24

#include <iostream>

int main() {
    char a[100];
    char *p1 = a;
    char *p2 = &a[99];
    std::cout << (int *)p2 - (int *)p1;
    return 0;
}
·

int arr[]所声明的数组arr是int数组,一般情况下它的元素大小是4字节

double arr[]所声明的数组arr是double数组,它的元素大小是8字节

int *a[]所声明的数组a是指针数组,它的元素大小与int无关

double *b[]所声明的数组b是指针数组,它的元素大小与double无关

可以假设数组a和数组b的元素大小为8字节,那么这正好对应着64位机的地址长度