【问题标题】:How do you cast a pointer to a character without using an ampersand?如何在不使用 & 符号的情况下将指针投射到字符?
【发布时间】:2014-12-31 20:47:03
【问题描述】:

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

所以我让它与这行代码一起工作:

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

但显然我需要找到一种方法来强制转换此指针而不使用 & 符号。有谁知道这样做的方法?我一直在寻找,但没有找到不涉及使用与号或其他我不允许使用的运算符(|、[、]、>、^)的方法。

【问题讨论】:

  • & 在这里不是位运算符。
  • 这个问题似乎离题了,因为它只是将 & 的功能误认为是位运算符。
  • 您的问题是您不能使用位运算符“指针表示法除外”。 &x 是指针表示法(无论如何它并不是一个真正的例外,因为在这种情况下,'&' 不是位运算符)。
  • 所以,实际上并没有覆盖地址...
  • 你真的不能用[]?

标签: c pointers casting ampersand


【解决方案1】:

建立工会。

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

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

【讨论】:

  • 也许是char c ??( 4 ??);[] 是不允许的,问题是这样说,但无论如何都不清楚)。
【解决方案2】:

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

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

所以,绝对不需要指针

【讨论】:

  • 这假定一个 2 字节的 int。算术运算符也可用于更大的int,但它变得更复杂,可能还需要%
  • @Dmitri:是的,但答案的重点是它可以工作,以及如何工作。不提供可粘贴的代码。
  • 这可能是最接近作业 (?) 实际寻找的内容...
【解决方案3】:

首先,& 在该用法中不是按位运算符。 & 字符只是为了两个完全不同的目的而重载(地址和按位与)。同样,在 C++ 中,当您编写 cout 时,您并没有进行位移。

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

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

但是,是否有可能在不使用 & 符号的情况下获取 C 变量的地址?嗯,我不排除这种可能性。即使您不使用 &,也可以使用数组名称返回地址这一事实来做一些事情,例如

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

【讨论】:

    【解决方案4】:

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

    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多