【问题标题】:Basic Pointer Usage基本指针用法
【发布时间】:2011-10-17 21:49:00
【问题描述】:

我正在尝试编写一个函数,它接受一个指向 int 的 void 指针,然后将 int 加倍,然后将其放回内存位置:

void doubleNumber(void *number){
    number = &((*((int*)(number))) * 2);

} 

所以首先我将它从 void * 转换为 int *,然后我遵循 int * 来获取值,然后乘以 2,然后我得到它的地址以将其放回指针中。

谁能告诉我为什么我的逻辑不起作用?

谢谢

【问题讨论】:

    标签: c memory pointers casting


    【解决方案1】:

    我会这样写:

    void doubleNumber(void *number){
        *(int*)number *= 2;
    }
    

    首先将number 转换为int* 类型。然后取消引用指针。然后加倍。

    您的代码的问题是您分配的是指针而不是指针。

    【讨论】:

    • 嗯,您分配给指针而不是指针。我想就差不多了。
    【解决方案2】:

    第 1 步:

    void doubleNumber(int *value) {
        *value = 2 * (*value);
    }
    

    第 2 步:

    void doubleNumber(void *value) {
        int * ivalue = (int *)value;
        *ivalue = 2 * (*ivalue);
    }
    

    【讨论】:

      【解决方案3】:

      首先,C中函数的参数是传值的,所以修改number是没有效果的。

      其次,即使是这样,您也应该先为该值分配一些内存。只有这样你才能返回一个指向内存中这个位置的指针。

      【讨论】:

        【解决方案4】:

        一个值(例如 2)没有地址。

        相反,只需写:

        * (*int)number = *(int*) number) * 2;
        

        或者,更短:

        * (*int)number *= 2;
        

        【讨论】:

        • 您不需要记住所有 C 的优先级规则,但值得记住的一个简单规则是,除了函数调用、数组下标和结构成员访问之外,一元运算符的优先级都高于其他任何操作运营商。所以*(int *)number 会做正确的事。
        猜你喜欢
        • 2016-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多