Tag: 指针

C函数指针强制转换为void指针

我试图运行下面的程序,但得到一些奇怪的错误: 文件1.c: typedef unsigned long (*FN_GET_VAL)(void); FN_GET_VAL gfnPtr; void setCallback(const void *fnPointer) { gfnPtr = *((FN_GET_VAL*) (&fnPointer)); } 文件2.c: extern FN_GET_VAL gfnPtr; unsigned long myfunc(void) { return 0; } main() { setCallback((void*)myfunc); gfnPtr(); /* Crashing as value was not properly assigned in setCallback function */ } 这里gfnPtr()在用gcc编译时在64位的suse linux上崩溃了。 但它成功地调用gfnPtr()VC6和SunOS。 但是,如果我改变下面给出的function,它是成功的。 void setCallback(const void *fnPointer) { […]

使用函数更改指针所包含的地址

如果我已经声明了一个指针p为int *p ; 在主模块中,我可以通过指定p=&a;来改变p所包含的地址p=&a; 其中a是已经声明的另一个整型variables。 我现在想通过使用函数来改变地址:: void change_adrs(int*q) { int *newad; q=newad; } 如果我从主模块调用这个函数 int main() { int *p; int a=0; p=&a; // this changes the address contained by pointer p printf("\n The address is %u ",p); change_adrs(p); printf("\n the address is %u ",p); // but this doesn't change the address return 0; } 地址内容不变。 […]

数组指向衰减并将multidimensional array传递给函数

我知道一个数组衰减到一个指针,如果一个声明 char things[8]; 然后在其他地方使用的things , things是一个指向数组中的第一个元素的指针。 另外,从我的理解,如果一个声明 char moreThings[8][8]; 那么moreThings 不是指向char的types指针,而是types“指向char的指针数组”,因为衰减只发生一次。 当更多的moreThings传递给一个函数(比如用原型void doThings(char thingsGoHere[8][8])来实现的时候,堆栈实际上是怎么回事? 如果moreThings不是指针types,那么这真的还是一个通过引用? 我想我一直认为moreThings仍然代表了multidimensional array的基地址。 如果doThings把input的thingsGoHere ,它自己把它传递给另一个函数呢? 规则非常多,除非指定一个数组input为const那么该数组将永远是可修改的? 我知道types检查的东西只发生在编译时,但我仍然困惑什么在技术上被视为通过引用传递(即只有当types指针的parameter passing,或指针数组是通过 – 通过引用以及?) 对不起,这个问题到处都是,但是由于我很难理解这个问题,所以很难说清楚一个确切的问题。

malloc(0)返回什么?

malloc(0)返回什么? 答案是一样的realloc(malloc(0),0) ? #include<stdio.h> #include<malloc.h> int main() { printf("%p\n", malloc(0)); printf("%p\n", realloc(malloc(0), 0)); return 0; } 从linux gcc输出: manav@manav-workstation:~$ gcc -Wall mal.c manav@manav-workstation:~$ ./a.out 0x9363008 (nil) manav@manav-workstation:~$ 输出保持每次malloc(0) 。 这是一个标准答案吗? 除了学术研究之外,为什么有人有兴趣得到这样一个指针呢? 编辑: 如果malloc(0)返回虚拟指针,那么如何工作: int main() { void *ptr = malloc(0); printf("%p\n", realloc(ptr, 1024)); return 0; } 编辑: 以下代码为每个迭代输出“可能”。 为什么它不会失败? #include<stdio.h> #include<malloc.h> int main() { int […]

C / C ++:指针算术

我正在读指针算术,我遇到了两个我不明白的东西,都知道它的用处 address_expression – address_expression 并且 address_expression > address_expression 有人可以向我解释他们,他们是如何工作,什么时候使用。 编辑: 我的意思是说,如果我只取两个地址并减去它们,它们会产生什么 如果我拿两个地址,并比较它们是什么结果或基于比较 编辑:我现在明白减去地址的结果,但比较地址我仍然没有得到它。 我知道1 <2,但是地址怎么比另一个更大,他们比较的是什么

为什么参考不能在C ++中重置

C ++引用有两个属性: 他们总是指向同一个对象。 他们不能是0。 指针是相反的: 他们可以指向不同的对象。 他们可以是0。 为什么在C ++中没有“不可空,可复位的引用或指针”? 我想不出一个很好的理由,为什么不应该重新提供参考。 编辑:问题经常出现,因为我通常使用引用时,我想确保一个“关联”(我在这里避免单词“参考”或“指针”)永远无效。 我不认为我曾经想过“这个参考文献总是指向同一个客体”。 如果引用是可复位的,那么仍然可以得到如下的当前行为: int i = 3; int& const j = i; 这已经是合法的C ++,但毫无意义。 我重申我的问题是这样的: “引用背后的原理是什么?对象的devise是什么?为什么引用总是相同的对象,而不是只有当声明为const? 干杯,菲利克斯

指针运算在C中

考虑下面的代码片段: int (*p)[3]; int (*q)[3]; q = p; q++; printf("%d, %d\n", q, p); printf("%d\n", qp); 我知道指针运算是智能的,这意味着操作q++提前q足够多的字节指向下一个3整数数组,所以我不惊讶第一个打印是12, 0 ',这意味着增加q在12日更大。 但是第二张照片确实给我带来了惊喜。 它打印1! 那么为什么要打印1而不是12呢? 它只是困惑我。

char * str =“STRING”和char str =“STRING”之间的区别?

编写一个简单的函数来从string中删除一个特定的字符时,我遇到了这个奇怪的问题: void str_remove_chars( char *str, char to_remove) { if(str && to_remove) { char *ptr = str; char *cur = str; while(*ptr != '\0') { if(*ptr != to_remove) { if(ptr != cur) { cur[0] = ptr[0]; } cur++; } ptr++; } cur[0] = '\0'; } } int main() { setbuf(stdout, NULL); { char test[] = "string […]

什么更有意义 – char *string或char *string?

可能重复: 在C中,为什么前面的variables名是星号,而不是后面的types? 我正在学习C ++,而且我遇到了很多以null结尾的string。 这让我想到了,声明指针的时候更有意义: char* string 要么 char *string ? 对我来说,char *格式更有意义,因为“string”的types是指向char的指针,而不是char。 不过,我通常会看到后者的格式。 这也适用于引用,显然。 有人能告诉我,后者的格式是否合乎逻辑?

为什么多态不工作没有指针/引用?

我在SO上已经find了一些相似的题目,但是当我读到答案的时候,他们把注意力集中在了真正具体的问题的不同部分(如STL /容器)上。 有人能告诉我为什么你必须使用指针/引用来实现多态吗? 我可以理解的指针可能会有所帮助 – 但确实引用只区分传递值和传递引用? 当然,只要你在堆上分配内存 – 这样你就可以拥有dynamic绑定,那么这就足够了 – 显然不是。