好的,我认为我们都同意下面的代码会发生什么变化,这取决于传递的内容, void deleteForMe(int* pointer) { delete[] pointer; } 指针可能是各种不同的东西,所以对其执行无条件的delete[]是未定义的。 不过,我们假设我们确实正在传递一个数组指针, int main() { int* arr = new int[5]; deleteForMe(arr); return 0; } 我的问题是,在这种情况下,指针是一个数组,谁知道这个? 我的意思是,从语言/编译器的angular度来看,它不知道arr是一个数组指针还是指向一个int的指针。 哎呀,它甚至不知道arr是否是dynamic创build的。 但是,如果我做了下面的事情, int main() { int* num = new int(1); deleteForMe(num); return 0; } 操作系统是足够聪明的,只删除一个整数,而不是去某种types的“杀死狂欢”删除超出该点的其余内存(对比,使用strlen和一个非\0终止的string – 它会保持直到击中0)。 那么谁的工作就是要记住这些东西? 操作系统在后台保存某种types的logging吗? (我的意思是,我意识到我是从这个post开始说发生的事情是不确定的,但事实是,“杀人狂”的情景不会发生,所以在实际的世界里有人记得)。
什么是箭头运算符( -> )的同义词?
我正在使用指向对象的向量。 这些对象是从一个基类派生的,并被dynamic地分配和存储。 例如,我有这样的东西: vector<Enemy*> Enemies; 我将从Enemy类派生,然后为派生类dynamic分配内存,如下所示: enemies.push_back(new Monster()); 什么是我需要注意的事情,以避免内存泄漏和其他问题?
什么时候使用任何语言的指针需要有人使用多个指针,比方说一个三重指针。 什么时候使用三指针而不是使用常规指针是有意义的? 例如: char * * *ptr; 代替 char *ptr;
我昨天正在采访一个中级软件工程职位的人,他提到,在C中,NULL并不总是零,而且他看到了C的实现,其中NULL不为零。 我觉得这非常可疑,但我想确定。 任何人都知道他是对的吗? (回答不会影响我对这个候选人的判断,我已经把我的决定提交给我的经理。)
我想我们都同意,通过以一维方式解引用其第一个元素(可能是偏移量)的指针来访问一个真正的multidimensional array被认为是惯用的C,例如: void clearBottomRightElement(int *array, int M, int N) { array[M*N-1] = 0; // Pretend the array is one-dimensional } int mtx[5][3]; … clearBottomRightElement(&mtx[0][0], 5, 3); 然而,在我的语言律师需要说服,这实际上是明确的C! 尤其是: 标准是否保证编译器不会在例如mtx[0][2]和mtx[1][0]之间填充内容? 通常,索引数组的末尾(除了末尾之外)是未定义的(C99,6.5.6 / 8)。 所以下面显然是不确定的: struct { int row[3]; // The object in question is an int[3] int other[10]; } foo; int *p = &foo.row[7]; // ERROR: […]
所以我觉得在制作函数指针时,不需要operator &来获取初始函数的地址: #include <stdio.h> double foo (double x){ return x*x; } int main () { double (*fun1)(double) = &foo; double (*fun2)(double) = foo; printf("%f\n",fun1(10)); printf("%f\n",fun2(10)); printf("fun1 = %p \t &foo = %p\n",fun1, &foo); printf("fun2 = %p \t foo = %p\n",fun2, foo); int a[10]; printf(" a = %p \n &a = %p \n",a,&a); return 0; } […]
我很难看到函数指针的效用。 我想在某些情况下它们可能是有用的(毕竟它们是存在的),但我不能想到使用函数指针更好或者不可避免的情况。 你可以给一些很好的使用函数指针的例子(在C或C ++中)?
这可能是一些常见和微不足道的事情,但我似乎无法find具体的答案。 在C#中有一个委托的概念,强烈地涉及到来自C ++的函数指针的思想。 Java中是否有类似的function? 鉴于指针是有点缺席,这是最好的方法是什么? 而要清楚的是,我们在这里讲第一课。
以下声明有什么区别? char * const a; const char * a; 为了理解我写的这个小程序的区别: #include <stdio.h> #include <stdlib.h> int main (int argc, char **argv) { char a = 'x'; char b = 'y'; char * const pc1 = &a; const char * pc2 = &a; printf ("Before\n"); printf ("pc1=%p\n", pc1); printf ("*pc1=%c\n", *pc1); printf ("pc2=%p\n", pc2); printf ("*pc2=%c\n", *pc2); […]