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

C 是否可以在整数指针(int*)中存储有符号整数?,c,pointers,integer,boolean,C,Pointers,Integer,Boolean,整数指针(但实际上任何指针类型)的特殊之处在于,您可以为它们指定NULL非整数类型的值;而一个整数无论如何都必须存储一个整数,无论是正整数还是负整数(如果我错了,请纠正我),并且不存储非整数值 然后,您是否可以利用指针的这种“特殊”功能(作为一个可以存储整数和非整数值的变量:NULL)同时存储整数值(通过它们的文字实际值,而不是地址,它将存储有符号/无符号整数)并且是一种布尔值——其中空指针表示假,而有效指针(即持有整数的指针)(但不是真正有效的ofc,只有一个不是空的指针)表示真 注意:指针绝

整数指针(但实际上任何指针类型)的特殊之处在于,您可以为它们指定
NULL
非整数类型的值;而一个整数无论如何都必须存储一个整数,无论是正整数还是负整数(如果我错了,请纠正我),并且不存储非整数值

然后,您是否可以利用指针的这种“特殊”功能(作为一个可以存储整数和非整数值的变量:
NULL
)同时存储整数值(通过它们的文字实际值,而不是地址,它将存储有符号/无符号整数)并且是一种
布尔值
——其中
空指针
表示
,而
有效指针
(即持有整数的指针)(但不是真正有效的ofc,只有一个不是
空的指针
)表示

注意:指针绝对不用于访问内存位置,只用于存储int

(Ofc这只是针对特定用例,而不是在常规代码中)


(如果你真的想知道的话)我正在尝试做一个递归函数,希望函数的返回值返回一个整数,但也希望跟踪一个条件,所以我也希望它返回一个布尔值,但是你显然只能返回一个参数。。。那么,传递一个整数指针(一个可以同时执行这两项操作的变量)是解决方案吗


我想到了其他方法(stucts,array…),但好奇的是,使用整数指针是否是一种可行的方法。

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

使用
NULL
其他东西的唯一好处是,您没有
malloc/释放
bool*
,但代价是语义错误和误用风险

下面是一个例子,我是如何理解你的提议的:

static void foo(int *_dontuse) {
    if (_dontuse != NULL) {
        /* do stuff */
    } else {
        /* do stuff */
    }
}
\u 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 */
}

或者试着用来实现它。

也许我弄错了,但是为什么不直接用
bool*
stdbool.h

使用
NULL
其他东西的唯一好处是,您没有
malloc/释放
bool*
,但代价是语义错误和误用风险

下面是一个例子,我是如何理解你的提议的:

static void foo(int *_dontuse) {
    if (_dontuse != NULL) {
        /* do stuff */
    } else {
        /* do stuff */
    }
}
\u 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 */
}

或者尝试使用。

指针对于NULL没有什么特殊之处。在不以8086实模式运行的基于Intel的现代实现中,指针仅为无符号整数,NULL为0。你不能用那种方式储存“额外”的东西


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

指针对于NULL没有什么特殊之处。在不以8086实模式运行的基于Intel的现代实现中,指针仅为无符号整数,NULL为0。你不能用那种方式储存“额外”的东西


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

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


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

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

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

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

也许吧。它可能“起作用”。即使在不取消引用指针的情况下,赋值也可能导致程序停止。即使转换成功,信息也可能丢失

整数可以转换为任何指针类型。除非之前另有规定,否则 结果是定义了实现,可能未正确对齐,可能未指向 引用类型的实体,可能是陷阱表示C11dr§6.3.2.3 5


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

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


。。一个整数必须,无论如何,存储一个整数

反例:代码可以将一个\u Bool存储为整数,并且可以原封不动地恢复
void*
可以保存在类型为
(u)intptr\u t
的整数中,并使用等效值恢复


可选类型
(u)intptr\u 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);
那你能帮我们吗