整数指针(但实际上是任何指针类型)的特殊之处在于,您可以为它们分配NULL
一种非整数值;而无论如何,一个整数都必须存储一个整数,它可以是正整数,也可以是负整数(如果我输入错了,请更正),并且不能使用非整数值。
然后,您能否利用指针的“特殊”功能(作为可以存储整数和NON-integer值的变量:NULL
)来同时存储整数值(通过它们的文字实际值,而不是地址,它将存储一个有符号/无符号整数),并且是一种boolean
-其中NULL pointer
表示false
和{{1 }}(即持有整数的那个)(但不是真正有效的ofc,只是不是valid pointer
的那个)将表示NULL
。
注意:绝对绝对不要使用指针来访问内存位置,而只是存储一个int。
(Ofc这仅用于特定的用例,而不是您可以使用常规代码来完成此操作)
(如果您真的想知道)我正在尝试制作一个递归函数,并希望该函数的返回值返回一个整数,但也希望跟踪条件,所以我也希望它返回一个布尔值,但是您显然只能返回一个参数...因此可以传递一个整数指针(一个可以同时执行两个操作的变量)作为解决方案?
我想到了其他方法(结构,数组..),但是很好奇是否使用整数指针可能是一种合理的方法。
答案 0 :(得分:3)
关于NULL的指针没有什么特别的。在不基于8086实模式运行的基于Intel的现代实现中,指针只是一个无符号整数,而NULL为0。您不能以这种方式“多余”存储一些东西。
如果您需要从函数中返回两个值,请创建一个包含int
和bool
的结构,并让您的函数返回该值。
答案 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
一起使用?
使用NULL
和something 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开始,并持续到某个大小)。就是这样,它只是内存段的一个数值。