对于一个项目,我需要将指针从int转换为char 以对十六进制值执行字节切换。唯一需要注意的是,我不允许使用&符号。
所以我让它使用这行代码:
int x = 5000;
char * ptr = (char *)&x;
但显然我需要找到一种不使用&符号来转换指针的方法。有谁知道这样做的方法?我一直在搜索,并且找不到使用&符号或其他不允许使用的操作符的方法(|,[,],<<, >>,^)。
答案 0 :(得分:8)
建立联盟。
union myUnion {
int x;
char c[4];
} u;
char* ptr = u.c;
u.x = 5000;
答案 1 :(得分:1)
交换sizeof(int)==2
和CHAR_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;
}