C#名称空间别名限定符(::)与解读操作符(.)的比较
快速简单的问题.我有点了解命名空间别名预选赛的作用,这是用于访问名称空间的成员,但是删除运算符也是如此.对于这种情况的差异,为什么您会使用另一个或它们如何完成同一件事感到困惑. using colAlias = System.Collections; namespace myns { class TestApp { static void Main() { colAlias.Hashtable test = new colAlias.Hashtable(); colAlias::Hashtable test1 = new colAlias::Hashtable(); } } } 解决方案 这是一个转角案例::(例如@前缀),可以处理相当罕见的事件,其中名称空间,类和关键字之间存在冲突. ::仅适用于名称空间(和名称空间别名),而..为两个名称空间和子
20 2024-04-17
编程技术问答社区
用指针使用2D数组的4种不同方法,哪个是正确的?解释一下会有很大的帮助
下面的四个程序输入一个2 D数组,然后将其打印出来. 第一个打印出垃圾价值并发出了一些警告 (我不明白). 第二个工作正常,这也有意义,正如我认为 2 d数组线性存储在内存中. 第三一个正常工作,但我不知道为什么它可以起作用. 第四个也有效. 因此,如果某人可以解释每种方法的方式,那将有很大的帮助 工作,欢呼 我害怕我对指针的工作的理解不如我想的那样好. int main(){ int n; int a [3][4]; int i=0,j=0,count=0; for(i=0;i
16 2024-04-10
编程技术问答社区
为什么取消引用主函数不显示内存内容?
我尝试获取函数名称指向地址的内存内容[abc()和main()],但是函数内的两个printf()都给出了相同的输出,尽管我取消了函数指向的地址在每个功能中的第二个printf()中名称.这是为什么?为什么内存地址由 *(ABC)和 *(main)而不是内容打印? #include void abc(){ printf("\n%p \n ", abc); printf("\n%#x\n ",*(abc)); } void main(){ abc(); printf("\n%p \n ", main); printf("\n%#x\n ",*(main)); } 解决方案 您尚未打印数据(实际上是代码),而是指向代码的指针的值. #include void abc(
28 2024-04-09
编程技术问答社区
解除对数组的NULL指针的引用在C语言中是否有效?
此行为是否定义? volatile long (*volatile ptr)[1] = (void*)NULL; volatile long v = (long) *ptr; printf("%ld\n", v); 它起作用,因为通过将指针指向数组,我们正在收到数组本身,然后将数组腐烂到指针到其第一个元素. 更新的演示: https://ideone.com/dqff6t 另外,GCC甚至将下一个代码视为恒定表达式: volatile long (*ptr2)[1] = (void*)NULL; enum { this_is_constant_in_gcc = ((void*)ptr2 == (void*)*ptr2) }; printf("%d\n", this_is_constant_in_gcc); 基本上,在编译时间删除Ptr2; 解决方案 this: long (*ptr)[1] = NULL; 正在声明指向" 1 long的
24 2024-04-09
编程技术问答社区
C语言的指针初始化和取消引用,这里有什么问题?
这应该非常简单,但是我不确定为什么编译器在这里抱怨. #include #include int main(int argc, char *argv[]) { int *n = 5; printf ("n: %d", *n); exit(0); } 获取以下投诉: foo.c:在功能" main"中: foo.c:6: 警告:初始化使指针 从没有演员的整数 我只想打印指针n引用的值.我在printf()语句中删除它,并且会得到一个细分错误.用gcc -o foo.c. 编译此版本 解决方案 您将指针设置为内存地址5,以便指向地址5的任何内容.您可能想将其指向值5存储的地址.例如: int v = 5; // Store the value 5 in a normal variable int *n = &v; // Make n contain the address of v, so
6 2024-04-09
编程技术问答社区
为什么在char字符串中没有解除引用的操作符?
假设我有2个功能: void function1(int *ptr) { printf("%d", *ptr); } 和 void function2(char *str) { printf("%s", str); } 当str之前没有尊重运算符时,函数2为什么可以工作?在str中,只有地址在我想的那样指向 value . 解决方案 为什么函数2在没有尊重操作员之前起作用 str 因为标准定义的%s期望char *,即地址. 7.21.6.1 如果没有长度修改器,则参数应为指向 字符类型数组的初始元素.人物 从阵列写成(但不包括) 终止空字符.如果指定精度,则不再 比许多字节写了. 如果不是指定精度或 大于阵列的大小,阵列应包含一个空字符. 其他解决方案 因为使用printf时pointer to a char是特殊的.它没有将其视为指向单个字符的指针,而是将其视为指向NUL界限符号中的第一个元素的指针,而是打
4 2024-04-09
编程技术问答社区
指针解除引用的工作原理是什么?
#define SWAP_PTRS(a, b) do { void *t = (a); (a) = (b); (b) = t; } while (0) Node* MergeLists(Node* list1, Node* list2) { Node *list = NULL, **pnext = &list; if (list2 == NULL) return list1; while (list1 != NULL) { if (list1->data > list2->data) SWAP_PTRS(list1, list2); *pnext = list1; pnext = &list1->next; list1 = *pnext; } *pnext = list2; return list; } 此代码来自这里,选择的答案是这个问题. 我在这里无法理解3行: *pnext
6 2024-04-09
编程技术问答社区
结构和指针到指针
我正在学习有关链接列表以及如何用结构和指针在C中创建它们的信息.我有一个示例.从我的理解来看,所谓的push()通过了我们的struct节点作为参数的开始存储位置.我们的push()函数的参数将结构节点作为指向指针的指针,因此将其作为参考传递,而不是实际的副本.因此,我们的struct node** headref的第一个指针只是指向我们头节点的内存位置的指针,第二个指针指向该值,这是头节点指向的下一个内存位置.我们通过分配一些内存来创建一个新的节点,称为NewNode.然后,我们在此节点内创建一个int类型数据. 好的,假设我说的一切都是正确的,下一部分就是我对此感到困惑. newNode->next= *headRef; 从我能理解headref的情况下,这线只有headref指向头节点.然后,我们进行了一个指针操作,其中headref指向的内容也将成为下一步指向的指向.基于我们新节点(newnode)中的下一个指针将指向头指针. 我也感到困惑的下一行是:
30 2024-04-09
编程技术问答社区
为什么我们必须在打印指针地址所在的内存中的值之前,将一个void指针投给int或其他东西?
我想知道为什么在将地址的内容打印在内存中,即使我们告诉printf()函数如何解释数据内存? 假设我们有以下代码: int main (void) { void* c = malloc(4); printf("%d",*c); return 0; } 为什么不可能这样做? 可以清楚地表明我的问题是无法做到这一点的原因是什么? 编辑: 在所有答案和研究之后,我仍然没有确切地确定汇编中的致命错误在哪里.我感到困惑的主要原因是我的编译器(GCC)只会在说"删除无效指针"时发出警告.这是实际错误吗?据我所知,即使警告仍应编译该程序. edit2 我仍然对我们有错误和警告的原因感到困惑,该警告似乎是完全分开的,但由同一件代码生成: pointer.c:7:13: warning: dereferencing 'void *' pointer
6 2024-04-08
编程技术问答社区
在C中的变量变量的变量的地址和分配了C中的变量之间有什么区别?
请参阅下面的两个代码! int main() { int a = 12; int *p; *p = a; } 和此代码, int main() { int a = 12; int *p; p = &a; } 在第一件代码中,将指针视为*p = a,在第二件代码中,variabe a的地址设置为指针变量. 我的问题是两种代码之间有什么区别? 解决方案 在您的第一件代码中: int main() { int a = 12; int *p; *p = a; } 您有一个严重的未定义行为,因为,您要做的就是将a的值分配给int变量,p 当前指向.但是,p尚未分配一个"地址",因此它将具有任意的 - 和 无效 - 值! 某些编译器可以初始化p至零(或NULL),但这仍然是一个无效的地址(在 系统上). 您的第二个代码段是"声音" int main() { int a
20 2024-04-08
编程技术问答社区
如果有的话,编译器什么时候会对指针解除引用的优化采取保守的态度?
所以,我最近对编译器(gcc (GCC) 4.8.3成为有问题的人)的兴趣是优化指针和指针. 最初,我创建了一个简单的整数和一个整数指针,并实现了 对此进行操作,以便我可以打印出来.正如预期的那样,所有操作 是否通过剥离指针对硬编码进行了选择. call __main leaq .LC0(%rip), %rcx movl $1, %edx call printf ,即使创建了一个插入INT指针的函数之后, 如果它仍然完美地选择了它并更改它. call __main leaq .LC0(%rip), %rcx movl $-1, %edx call printf 现在,当我将指针视为空隙并进行更改时 通过将其施放给char并将其删除,它实际上仍然选择了 完美(我最初将其视为8个字节以来,"额外"的MOV呼叫 值,然后作为指针删除的1个字节值) call __main movl $4, 44(%rsp
4 2024-04-08
编程技术问答社区
在memcpy和dereference之间的优先选择
在内存中复制已知结构时,您是否希望使用memcpy或Dereference?为什么? 具体而言,在以下代码中: Would you prefer method 1 or method 2? I looked at the assembly generated by gcc, and it seems that method 2 uses less instructions than method 1. Does it imply that method 2 is preferable in this case? Thank you. 解决方案 I can't think of any good reason to use memcpy()复制结构时而不是分配(只要您不需要做它们具有完全相同的语义,分配(a)可能会给编译器提供更多优化的机会,并且(b)的风险更少. 某些非常旧的C编译器可能不支持结构分配,但这不再是一个重大问题. (还有其他理由希望在C ++中进行
8 2024-04-08
编程技术问答社区
C语言中的*和&有什么区别?
我正在学习c,但我仍然不确定我是否了解&和*之间的区别. 允许我尝试解释它: int a; // Declares a variable int *b; // Declares a pointer int &c; // Not possible a = 10; b = &a; // b gets the address of a *b = 20; // a now has the value 20 我得到了这些,但后来变得令人困惑. void funct(int a) // A declaration of a function, a is declared void funct(int *a) // a is declared as a pointer void funct(int &a) // a now receives only pointers (address) funct(a) // Creates a copy of a funct(*a) //
10 2024-04-07
编程技术问答社区
打印指向整数的指针会导致分段故障。为什么?
#include main() { int *num2=20; printf("\n\n\n%d",num2); } 当我按原样运行它时,它会打印20.如果使用*num2,它会导致分割故障.为什么? 解决方案 为什么打印num还可以,但是*num导致分割故障? 当您说int *num2=20;时.它等同于 int *num; /* Type:(int*) num is a pointer to an integer and hence holds address of an integer object. */ num = 20; /* Type of the value assigned to num is (int).*/ 您将int分配给int *.您应该收到 warning: initialization makes pointer from integer without a cast[enabled by d
4 2024-04-07
编程技术问答社区
为什么单数*运算符没有 "操作数不得是指向void的指针 "的约束条件?
c2x,6.5.3.2地址和间接操作员,约束,2: 单元 *操作员的操作数应具有指针类型. 为什么没有约束"操作数不会是指向void的指针"? 虽然可以从: 中推导它 C2X,6.5.3.2地址和间接操作员,语义,4: Unary *操作员表示间接.如果操作数指向一个函数,则结果是功能指定器.如果指向一个对象,则结果是指定对象的lvalue . c2x,6.3.2.1 lvalues,数组和功能指定器,1: an lvalue 是一种表达式(具有对象类型),它可能指定对象; ... 解决方案 一个可能的(尽管有些人为,我会承认)添加您的"建议"约束将破坏代码的情况是&和*运算符的位置.在这种情况下,a = &*p之类的表达式,其中p是void* type,是允许的. 来自 语义 3一元&运营商产生了其地址 操作数.如果操作数具有"类型"类型,则结果具有类型 ‘指定键入''. 如果操作数是一元*的结果 操作员,既不评估运算符和&运算
4 2024-04-07
编程技术问答社区
关于解除对'void *'指针的引用
我无法从以下代码行中删除上述警告.数据是无效的指针,作为回调函数的一部分将在数据指针中接收字符串.正如我打了空隙指针,但编译器仍显示警告. 基本上有两个警告在下线上出现. 1.删​​除" void *"指针 2.进行类型'void 的表达地址 service_ind = atoi((const char*)&data[at_response.param[0].start_of_value_index]) ? TRUE:FALSE ; 以下是必需的信息 void * data; AT_PARSER_RESPONSE at_response; typedef struct { /*Other parameters */ AT_PARAM param[AT_MAX_NUM_PARAM]; }AT_PARSER_RESPONSE 解决方案 引用C11,第§6.5.3.2章: 单元*操作员表示间接.如果操作数指向功能,则结果是 功能指定器;如果指向一个对
10 2024-04-06
编程技术问答社区
解除引用的指针结构的地址
in unqlite c库,我发现了以下代码: pObj = jx9VmReserveMemObj(&(*pVm),&nIdx); 其中pVm是: typedef struct jx9_vm jx9_vm; jx9_vm *pVm 和称为函数称为: jx9_value * jx9VmReserveMemObj(jx9_vm *, sxu32 *); 构造&(*pVm)在呼叫中使用的是什么? &(*pVm)等于pVm? 解决方案 引用C11,第§6.5.3.2,地址和间接操作员 [...]如果操作数是Unary *操作员的结果, 均未评估运算符和& & &的结果,结果仿佛两者都是 省略,除了操作员的约束仍然适用,结果不是lvalue. [...] so,是,它们是等效. 但是,可以使用此构造来检查针对指针类型的参数类型.从Unary *操作员的属性中, Unary *操作员的操作数应具有指针类型. 所以,构造&(*pVm
4 2024-04-06
编程技术问答社区
C语言编程。解除对不完整类型指针的参考错误
我的结构定义为: struct { char name[32]; int size; int start; int popularity; } stasher_file; 以及对这些结构的一系列指针: struct stasher_file *files[TOTAL_STORAGE_SIZE]; 在我的代码中,我将指针定为结构并设置其成员,然后将其添加到数组中: ... struct stasher_file *newFile; strncpy(newFile->name, name, 32); newFile->size = size; newFile->start = first_free; newFile->popularity = 0; files[num_files] = newFile; ... 我会收到以下错误: 错误:将指针指向不完整的类型 每当我尝试访问newFile内的成员时.我在做什么错?
6 2024-04-06
编程技术问答社区
如何理解C语言中的指针星*?
我在指针符号中挣扎 *,我发现它在声明和表达式中的使用方式非常困惑. 例如: int *i; // i is a pointer to an int 但是语法背后的逻辑是什么? *在我的意思之前 *是什么?让我们举以下示例.请在我错的地方纠正我: char **s; char *(*s); // added parentheses to highlight precedence 这就是我失去轨道的地方. parantheses之间的 *s表示:S是指针吗?但是指向什么? * *括号外的 *指向指向什么指向的指针? 因此,这是:指向指向什么指向char的指针? 我很茫然. *符号在声明和表达中的解释方式有所不同吗?如果是这样,它的解释方式如何?我要去哪里? 解决方案 C中的声明规则是,您以使用它的方式将其声明. char *p表示您需要*p获得char, char **p表示您需要**p获得char. 其他解决方案 这样做:
12 2024-04-06
编程技术问答社区