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);
那你能帮我们吗