如何在不使用&符的情况下将指针指向角色?

时间:2014-11-04 20:04:01

标签: c pointers casting ampersand

对于一个项目,我需要将指针从int转换为char 以对十六进制值执行字节切换。唯一需要注意的是,我不允许使用&符号。

所以我让它使用这行代码:

int x = 5000;
char * ptr = (char *)&x; 

但显然我需要找到一种不使用&符号来转换指针的方法。有谁知道这样做的方法?我一直在搜索,并且找不到使用&符号或其他不允许使用的操作符的方法(|,[,],<<, >>,^)。

4 个答案:

答案 0 :(得分:8)

建立联盟。

union myUnion {
  int x;
  char c[4];
} u;

char* ptr = u.c;
u.x = 5000;

答案 1 :(得分:1)

交换sizeof(int)==2CHAR_BIT==8和2s-complement的字节,无需位操作或地址:

int swapbytes(int i) {
    return (signed)( (unsigned)i / 256 + (unsigned)i * 256);
}

所以,绝对不需要指针

答案 2 :(得分:0)

嗯,首先,&在这种用法中不是一个按位运算符。 &符号只是因为两个完全不同的目的而重载(地址和按位AND)。类似地,在C ++中,当您编写 cout<<“\ n”; 时,您没有进行一次移位。

其次,您可以通过以下方式轻松地将整数转换为指针:

 long l=0x8000;       //I read the datasheet and saw that there's a buffer at 0x8000...
 void*p = (void*) l;  

是否可以在不使用&符号的情况下获取C变量的地址?好吧,我不会排除这一点。即使你不使用&amp ;,例如,你也可以做一些事情,即数组名称返回一个地址。

int a[40];      
printf("%d\n",a);  //Prints an address
printf("%d\n",&a); //Prints the same address   

答案 3 :(得分:0)

根据您的要求,不是|[]<<>>^&(假设取消引用和按位) AND):

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int x = 5000;
    char *ptr;

    /* magic steps begin
     * (DO NOT USE IN PRODUCTION CODE, PROTECT YOUR ENVIRONMENT, etc.) */
    int *x_helper = malloc(sizeof *x_helper);
    *x_helper = x;
    ptr = (char *) x_helper;
    /* magic steps end */

    return 0;
}