我知道经验法则是从右至左阅读声明,而且我确信自己知道发生了什么,直到一位同事告诉我: const MyStructure** ppMyStruct; 意思是“ppMyStruct是指向一个(可变的)MyStructure的常量指针的指针 ”(在C ++中)。 我会认为这意味着“ppMyStruct是一个指向常量MyStructure的指针 ”。 我在C ++规范中寻找答案,但显然我不是很擅长这个… 在C ++中意味着什么,在C中意味着什么?
当你学习C ++时,或者至less当我通过C ++ Primer学到C ++时 ,指针被称为它们指向的元素的“内存地址”。 我想知道这在多大程度上是真的。 例如,两个元素*p1和*p2是否具有属性p2 = p1 + 1或p1 = p2 + 1 当且仅当它们在物理内存中是相邻的?
我读了C中的函数指针。大家都说这会让我的程序运行缓慢。 这是真的吗? 我做了一个程序来检查它。 在这两种情况下我都得到了相同的结果。 (测量时间) 那么,使用函数指针是不是很好? 提前致谢。 为了回应一些人。 我说我在比较一个循环的时候“运行缓慢”。 喜欢这个: int end = 1000; int i = 0; while (i < end) { fp = func; fp (); } 当你执行这个,我得到了同样的时间,如果我执行这个。 while (i < end) { func (); } 所以我认为函数指针没有时间差别,也没有像很多人说的那样让程序运行缓慢。
我和一些人说过,即使C没有被解除引用,C的out-of-bound指针也会导致未定义的行为。 例: int a; int *p = &a; p = p – 1; 这里的第三行会导致未定义的行为,即使p永远不会被解除引用( *p永远不会被使用)。 在我看来,如果没有使用指针,C会检查指针是否超出范围,这听起来是不合逻辑的(就像有人会检查街上的人看他们是否携带枪支,以防他们进入他的房子。那些理想的事情就是在人们进入房子的时候检查他们)。 我认为,如果C检查,那么会发生很多运行时间的开销。 另外,如果C真的检查OOB指针,那么为什么这不会导致UB: int *p; // uninitialized thus pointing to a random adress 在这种情况下,即使指向OOB地址的机会很高,为什么什么也不会发生。 加: int a; int *p = &a; p = p – 1; 说&a是1000.评估第三行后p的值是: 996,但仍然是未定义的行为,因为p可能在其他地方被解引用并导致真正的问题。 未定义的值 ,这是未定义的行为。 因为我认为“第三行被称为”未定义的行为“首先是因为将来可能会使用OOB指针(取消引用)和人,随着时间的推移,它将其作为一个未定义的行为。 现在, p的值是100%还是996 ,还有未定义的行为或者它的值是不确定的?
如果我想传递一个已知或未知大小的数组作为函数参数,我很困惑要使用哪种语法。 假设我有这些变种的目的: void func1(char* str) { //print str } void func2(char str[]) { //print str } void func3(char str[10]) { //print str } 使用其中每一个的优点和缺点是什么?
我刚刚读到,我们需要指定types的指针,而在C(或C ++)中声明它们,即: int *point ; 据我所知,指针存储variables的地址,地址占用相同数量的内存,无论types如何。 那么,为什么我们需要声明它的types呢?
我在我的Java项目中使用了jna.jar,jna-3.2.5.jar和jna-3.3.0-platform.jar。 这是我想复制的Winapi函数。 BOOL WINAPI MagImageScalingCallback( _In_ HWND hwnd, _In_ void *srcdata, _In_ MAGIMAGEHEADER srcheader, _Out_ void *destdata, _In_ MAGIMAGEHEADER destheader, _In_ RECT unclipped, _In_ RECT clipped, _In_ HRGN dirty ); 这是我的Java代码 public interface MagImageScalingCallback extends StdCallLibrary.StdCallCallback{ public boolean MagImageScalingCallback(HWND hwnd, Pointer srcdata, MAGIMAGEHEADER.ByValue srcheader, Pointer destdata, MAGIMAGEHEADER.ByValue destheader, RectByValue source, RectByValue clipped, HRGN dirty); } […]
我使用下面的一段代码作为更大程序的一部分从文件中读取数据。 double data_read(FILE *stream,int code) { char data[8]; switch(code) { case 0x08: return (unsigned char)fgetc(stream); case 0x09: return (signed char)fgetc(stream); case 0x0b: data[1] = fgetc(stream); data[0] = fgetc(stream); return *(short*)data; case 0x0c: for(int i=3;i>=0;i–) data[i] = fgetc(stream); return *(int*)data; case 0x0d: for(int i=3;i>=0;i–) data[i] = fgetc(stream); return *(float*)data; case 0x0e: for(int i=7;i>=0;i–) data[i] = fgetc(stream); […]
我想知道之间的区别 const int* ptr; 和 int * const ptr; 以及它如何工作。 我很难理解或记住这一点。 请帮忙。
我在iTunes U上试图从斯坦福大学的iPhone课程,我对指针有些困惑。 在第一个任务中,我试着做这样的事情 NSString *processName = [[NSProcessInfo processInfo] processName]; NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier]; 哪一个产生了一个错误,经过盲目的调味,我发现这是NSInteger系列中的*导致的问题。 所以我显然不明白发生了什么事情。 我会解释我认为它是如何工作的,也许有人会善意指出这个缺陷。 与网站开发不同的是,我现在需要担心内存,而不是在Web开发中。 所以当我创build一个variables的时候,它被分配了一些内存(RAM我认为)。 我不是传递variables,而是传递一个指向这个位的指针。 指针是通过在variables名前加*来声明的。 假设我是对的,那么为什么我不需要为NSInteger做这件事呢?