char* a = *(char**)e1 的char**什么意思
时间: 2023-12-06 20:05:28 浏览: 104
`char**`是一个指向指针的指针,也称为二级指针。在`char* a = *(char**)e1`中,`(char**)e1`将`e1`强制转换为指向指针的指针,即二级指针,然后`*(char**)e1`将其解引用为指向字符的指针,即一级指针。最终,`char* a`将指向解引用后的一级指针所指向的字符。
相关问题
int cmp_chars(const void* e1, const void* e2) { return strcmp((char*)e1, *(char*)e2); }为什么用的是const void*
使用const void*作为函数参数的原因是为了增加函数的通用性和灵活性。
首先,const关键字表示指针所指向的数据是只读的,即在函数内部不会修改指针所指向的数据。这样做可以提高代码的安全性,避免无意中修改了不应该被修改的数据。
其次,void*是一种通用指针类型,可以指向任何类型的数据。这意味着我们可以将任意类型的指针传递给该函数,而不需要为不同的数据类型编写多个函数。这种灵活性使得函数可以适用于不同的场景,提高了代码的重用性。
在具体实现中,我们可以通过类型转换将void*指针转换为相应的类型指针,以便在函数内部进行操作。在这个例子中,我们将const void*转换为char*和char**,并使用strcmp函数进行比较。
总而言之,使用const void*作为函数参数可以使函数更加通用和灵活,适用于各种不同类型的数据。
void input() { cout << "请输入:"; char ch; while ((ch = getchar()) != '\n') { inputToken[tokenNumber].value = ch; if (ch == '(') inputToken[tokenNumber].tokenType = leftBracket; else if (ch == ')') inputToken[tokenNumber].tokenType = rightBracket; else if (ch == '+') inputToken[tokenNumber].tokenType = addop; else if (ch == '*') inputToken[tokenNumber].tokenType = mulop; else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) inputToken[tokenNumber].tokenType = id; else inputToken[tokenNumber].tokenType = undefine; tokenNumber++; } inputToken[tokenNumber++].tokenType = endInput; } TreeNode* E() { TreeNode* node = new TreeNode; node->flag = "E"; switch (inputToken[curPos].tokenType) { case id: case leftBracket: { TreeNode* tNode = node->firstChild = T(); if (error) return node; tNode = tNode->nextSibling = E1(); break; } default: node = errorNode(); error = true; break; } return node;这段代码是什么意思
这段代码是语法分析器中的一部分,实现了对表达式的E部分的语法分析。在这段代码中,input函数用于读取输入的表达式,并将其转换为词法单元序列,存储在inputToken数组中。
E函数是一个递归下降函数,用于对表达式的E部分进行语法分析。在该函数中,首先创建一个新的语法树节点,并将其标记为E。然后根据当前词法单元的类型进行分支处理。
如果当前词法单元的类型为id或leftBracket,则调用T函数进行语法分析,并将其设置为E节点的第一个子节点。如果T函数返回的节点存在错误,则直接返回E节点。
然后,继续调用E1函数进行语法分析,并将其设置为E节点的第二个子节点。注意,E1函数是用于处理左递归的情况的函数。
如果当前词法单元的类型不是id或leftBracket,则说明表达式不符合文法规则,返回一个错误节点,并将error标志设置为true。
最后,返回E节点。
阅读全文