我可以通过 char* 指针访问 int 变量的每个字节吗?

Pld*_*ldx 2 c pointers

我想知道我是否可以使用 char* 值来访问 int 值的每个字节......所以我尝试使用一个指针值来访问 int 的第一个字节和一个 for 循环来访问 int 的其他字节...
这是代码:

int char_to_bin(char* d){
    int p= (int)*d;
    int i=0,number=0;
    if (p>=0){
        do{

            number+= (p%2)*(pow(10,i));
            i++;
            p= p/2;
            }while (p>0);
        }
    else{
        p=p *(-1);
        do{

            number+= (p%2)*pow(10,i);
            i++;
            p=p/2;
            }while (p>0);
        number*=-1;
        }

    return number;
}

long int int_to_bin(int* p){
    long int j=1,number=0,number1=0,number2=0,digits;
    char* c=&p;
    number=char_to_bin(c);
    for (j;j<(sizeof(int)/sizeof(char));j++){
        number1=char_to_bin(c+j);
        digits=floor(log10(abs(number1))) + 1;
        number2=number1*pow(10,digits);
        number=number1+number2;
    }
    return number;
}


int main(){

    char k= 100;
    char* j= &k;
    int inte=100;
    int *h;
    h= &inte;
    int c= char_to_bin(j);
    printf("%d\n",c);
    long int d= int_to_bin(h);
    printf("%ld\n",d);
}
Run Code Online (Sandbox Code Playgroud)

该函数int char_to_bin(char* d)将指向的字符值转换为二进制数,我对它所做的所有测试都表明它有效。但是,当我用int char_to_bin(char* d)int_to_bin(int* p)不顺心的事。
基本上,int_to_bin(int* p)应该将指向的 int 的第一个字节转换为二进制,然后将以下字节(因为 char* 指向一个字节)转换为十进制,将字节乘以 10^(位数),这样我就可以得到例如,像“000000001100100”这样的数字但是出了点问题,函数的结果与二进制有很大不同,另外,我试图printf("%d \n",number1)int_to_bin(int* p)函数中放入一个,如下所示:

long int int_to_bin(int* p){
    long int j=1,number=0,number1=0,number2=0,digits;
    char* c=&p;
    number=char_to_bin(c);
    for (j;j<(sizeof(int)/sizeof(char));j++){
        number1=char_to_bin(c+j);
        printf("%d \n",number1); //---------------here------------------
        digits=floor(log10(abs(number1))) + 1;
        number2=number1*pow(10,digits);
        number=number1+number2;
    }
    return number;
}
Run Code Online (Sandbox Code Playgroud)

检查给定内存地址中包含的值......据我所知,int变量类型占用4个字节的内存,字节内容的总和是值或变量......但我得到了结果总和与变量值完全不同。
有什么办法可以解决这个问题,还是我应该放弃并尝试将传递的 int 转换int_to_bin(int* p)为 char 并将其传递给char_to_bin(char* p)函数?

hyd*_*yde 5

据我所知,int变量类型占用4个字节的内存,字节内容的总和就是值或者变量...

嗯,intsizeof(int)字节,在现代 PC 操作系统(64 位和 32 位)上通常是4,但只要sizeof(short)<= sizeof(int)<= ,它可以是任何东西sizeof(long)。所以总是使用sizeof而不是硬编码值。

但是值不是内容的总和......那将是非常浪费的,不同顺序的相同字节会给出相同的int。值是,取决于字节顺序,并假设无符号数:

(c[0] << 24) | (c[1] << 16) | (c[2] << 8) | (c[3] << 0); // big endian
Run Code Online (Sandbox Code Playgroud)

或者

(c[3] << 24) | (c[2] << 16) | (c[1] << 8) | (c[0] << 0); // little endian
Run Code Online (Sandbox Code Playgroud)

哪里unsigned char *c = (unsigned char*)(&unsigned_int_variable);


请注意,即使char*指针是例外(请参阅注释),但通常将不同类型的指针设置为指向值会破坏所谓的“严格别名规则”,您应该在执行此类操作之前阅读该规则

  • `char *` 是严格别名规则的一个例外(允许实现诸如 `memcpy` 之类的东西)。但除此之外,这是正确的。 (2认同)