是否可以将带符号整数存储在整数指针(int *)中?

时间:2018-07-29 13:28:37

标签: c pointers integer boolean

整数指针(但实际上是任何指针类型)的特殊之处在于,您可以为它们分配NULL一种非整数值;而无论如何,一个整数都必须存储一个整数,它可以是正整数,也可以是负整数(如果我输入错了,请更正),并且不能使用非整数值。

然后,您能否利用指针的“特殊”功能(作为可以存储整数和NON-integer值的变量:NULL)来同时存储整数值(通过它们的文字实际值,而不是地址,它将存储一个有符号/无符号整数),并且是一种boolean-其中NULL pointer表示false和{{1 }}(即持有整数的那个)(但不是真正有效的ofc,只是不是valid pointer的那个)将表示NULL

注意:绝对绝对不要使用指针来访问内存位置,而只是存储一个int。

(Ofc这仅用于特定的用例,而不是您可以使用常规代码来完成此操作)


(如果您真的想知道)我正在尝试制作一个递归函数,并希望该函数的返回值返回一个整数,但也希望跟踪条件,所以我也希望它返回一个布尔值,但是您显然只能返回一个参数...因此可以传递一个整数指针(一个可以同时执行两个操作的变量)作为解决方案?

我想到了其他方法(结构,数组..),但是很好奇是否使用整数指针可能是一种合理的方法。

4 个答案:

答案 0 :(得分:3)

关于NULL的指针没有什么特别的。在不基于8086实模式运行的基于Intel的现代实现中,指针只是一个无符号整数,而NULL为0。您不能以这种方式“多余”存储一些东西。

如果您需要从函数中返回两个值,请创建一个包含intbool的结构,并让您的函数返回该值。

答案 1 :(得分:3)

  

是否可以在整数指针(int *)中存储有符号整数?

也许。它可能“起作用”。即使没有取消引用指针的分配,也可能导致程序停止。即使转换成功,信息也可能丢失。

  

整数可以转换为任何指针类型。除先前指定外,   结果是实现定义的,可能未正确对齐,可能未指向   引用类型的实体,并且可能是陷阱表示形式C11dr§6.3.2.35

// Sample implementation
int i = -rand();
printf("i: %d\n", i);
int *iptr = (int *) i;   // implementation-defined
printf("iptr: %p\n", (void*) iptr);

  

整数指针(?)有什么特别之处

它们的值正确,可以在取消引用时对齐,以指向特定的整数类型。它们可能存在于不适合某些其他类型的地址空间中。 C甚至允许int *窄于void *。 (虽然有一段时间没看到机器可以利用它了。)


  

..整数无论如何都必须存储一个整数...

计数器示例:代码可以将_Bool存储为整数,并且可以原样恢复。 void *可以保存为(u)intptr_t类型的整数,并可以使用等效值恢复。


可选类型(u)intptr_t的整数可以转换为void*并保持指针等效。在直接转换其他非字符指针或函数指针时,不一定是正确的。对于其他整数类型,不一定是正确的。

some_type_t *some_valid_object_pointer = ...;
intptr_t i = (intptr_t)(void*) some_valid_object_pointer;
some_type_t *some_valid_object_pointer2 = (some_type_t*)(void*)i;
assert(some_valid_object_pointer == some_valid_object_pointer2);
  

然后您可以利用指针的“特殊”功能

不一定。 OP的实现可能在选择性平台上工作,但是缺少指定的行为和可移植性。

答案 2 :(得分:0)

也许我弄错了,但为什么不将bool *stdbool.h一起使用?

使用NULLsomething else的唯一好处是您没有 分配/释放bool *,但代价是语义不正确和滥用风险。

以下是一个示例,说明我如何理解您的建议:

static void foo(int *_dontuse) {
    if (_dontuse != NULL) {
        /* do stuff */
    } else {
        /* do stuff */
    }
}

_dontuse仅在内部使用,您永远不会malloc /释放它,而是让它指向任意的内存位置。因此具有潜在的风险。

更好的主意:

#include stdbool.h

struct Sometype {
    bool done;
    /* other members */
};

static void internalfoo(struct Sometype *data) {
    /* use data, maybe store bool inside struct for ifs */
    if (data->done) return;
    /* do something */
    data->done = true; /* need to set it to true, to terminate */
    internalfoo(data);

}

void foo() {
    struct Sometype data;
    data.done = false;
    internalfoo(&data);
    /* do something with result */
}

或者尝试使用dynamic programming来实现。

答案 3 :(得分:0)

是的,可以[如果您正在32位或64位系统上工作]。在这些情况下,int的大小小于或等于int*的大小,因此这样做没有任何问题。

NULL只是指向您无法访问的RAM段的指针(该段以地址0开始,并持续到某个大小)。就是这样,它只是内存段的一个数值。