Tag: 指针

指向数组指针

我有一个int指针数组int* arr[MAX]; 我想将其地址存储在另一个变量中。 如何定义指针数组的指针? 即: int* arr[MAX]; int (what here?) val = &arr;

数组衰减到指针的情况是什么?

我只知道一个例子,当数组传递给一个函数时,它们会衰变成一个指针。任何人都可以详细说明数组衰减到指针的所有情况。

什么是C的前向参考?

C中关于指针的前向引用是什么? 我能举个例子吗?

是否有可能进行有效的基于指针的二进制堆实现?

甚至可以使用指针而不是数组来实现二进制堆 ? 我搜索了互联网(包括SO),但没有找到答案。 这里的主要问题是,你如何跟踪最后一个指针? 将X插入堆中时,将X放在最后一个指针处,然后将其冒泡。 现在,最后一个指针指向哪里? 而且,当你想删除root时会发生什么? 您将根与最后一个元素交换,然后向下冒泡新根。 现在,您如何知道再次删除root时所需的新“最后一个元素”是什么?

零长度数组与指针

编辑:显然其中一些不允许/已经改变了各种C标准。 对于我自己的假设好处,让我们假装我们使用的是gcc test.c而没有标准或警告选项。 特别是我正在研究引擎盖下的细节。 我加入了目前的理解。 我对吗? char **c1; //Size for a pointer is allocated on the stack. sizeof(c1) == sizeof(void*) char *c2[0]; //Nothing is allocated on the stack. sizeof(c2) == 0 我不知道这两种情况之间是否存在其他一些差异(除了sizeof)? struct a { int i; char c[0]; //sizeof(a) is sizeof(int)? ac == (&i)+1? }; 据我了解,这通常用于结构末端的可变长度数组。 但是关于 struct b { char *c[0] //sizeof(b) is […]

限制指针算术或比较的基本原理是什么?

在C / C ++中,仅当结果指针位于原始指向的完整对象内时,才定义指针的加法或减法 。 此外,只有当两个指向对象是唯一完整对象的子对象时,才能执行两个指针的比较 。 这种限制的原因是什么? 我认为分段内存模型(参见此处 §1.2.1)可能是其中一个原因,但由于编译器实际上可以定义所有指针的总顺序,如此答案所示 ,我对此表示怀疑。

intptr_t有什么用?

我知道它是一个整数类型,可以在不丢失数据的情况下强制转换为指针,但为什么我要这样做呢? 有一个整数类型有什么优势可以使用void*来保存指针而使用THE_REAL_TYPE*进行指针运算? 编辑 标记为“已经被问到”的问题没有回答这个问题。 问题是如果使用intptr_t作为void*的一般替换是一个好主意,那里的答案似乎是“不要使用intptr_t”,所以我的问题仍然有效:什么是intptr_t一个很好的用例?

为什么修改字符串的代码不起作用?

对于c风格的字符串,如何将字符指针指向的内存地址赋予char? 例如,在下面的示例中,我想将num更改为“123456”,因此我尝试将p设置为“0”所在的数字,并尝试用“4”覆盖它。 谢谢。 #include #include int main() { char* num = (char*)malloc(100); char* p = num; num = “123056”; p = p+3; //set pointer to where ‘4’ should be p = ‘4’; printf(“%s\n”, num ); return 0; }

指针默认值。?

看, typedef struct jig { int *a; int *b; }temp; 现在第1阶段 : temp *b; b= (temp*)malloc(sizeof(temp)); if(b->a != NULL) printf(“a is not null\n”); else printf(“a is null\n”); if(b->b != NULL) printf(“b is not null\n”); else printf(“b is null\n”); 输出是: a is null b is null 现在第2阶段 : temp b; if(ba != NULL) printf(“a is not […]

如何获取基堆栈指针的地址

我正在将应用程序从x86移植到x64。 我正在使用Visual Studio 2009; 大多数代码是C ++,有些部分是纯C。在编译x64时,不支持__asm关键字,我们的应用程序包含内联汇编程序的一些部分。 我没有写这段代码所以我不确切知道应该做什么: int CallStackSize() { DWORD Frame; PDWORD pFrame; __asm { mov EAX, EBP mov Frame, EAX } pFrame = (PDWORD)Frame; /*… do stuff with pFrame here*/ } EBP是指向当前函数堆栈的基指针。 有没有办法在不使用内联asm的情况下获取堆栈指针? 我一直在关注微软提供的内在函数作为内联asm的替代品,但我找不到任何能给我带来帮助的东西。 有任何想法吗? 安德烈亚斯询问用pFrame做了什么。 这是完整的function: int CallStackSize(DWORD frameEBP = 0) { DWORD pc; int tmpint = 0; DWORD Frame; PDWORD pFrame, […]