我在使用typedef理解指向函数的指针的语法时遇到了问题.我已经阅读了很多答案,但仍然无法理解.我会试着解释一下我是如何看待事物的,这样你才能理解我的想法.
因此我们使用typedef为现有类型提供别名,例如:
typedef int number;
Run Code Online (Sandbox Code Playgroud)
这样我们可以使用与整数相同的数字(类似于预处理器指令 - 我知道在制作指针的typedef时会有一些差异).另一个例子 :
typedef struct
{
int num;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)
将为未命名的结构提供名为MyStruct的别名.
所以这是函数typedef指针的语法:
typedef int (*pFunc)(int, int);
Run Code Online (Sandbox Code Playgroud)
也许我很难理解这一点,因为typedef就像它给TYPES赋予别名的名字而且函数不是完全类型但是无论如何,根据我的理解,这更像是指向某种函数签名的指针,所以第一个int是返回的类型,第二个括号用于指示传递给函数的参数是什么类型.现在我不太明白这一部分:
(*pFunc)
Run Code Online (Sandbox Code Playgroud)
好吧,说我是对的,通常指向一些内存的指针声明如下:
int *p;
double *p;
.
.
.
Run Code Online (Sandbox Code Playgroud)
因此,按照以下方式进行操作会更有意义:
(pFunc*)
Run Code Online (Sandbox Code Playgroud)
因为对我而言,如果星号位于名称之前,它看起来像pFunc是某种类型的类型指针的变量名,而不是实际的类型指针.
好吧,另一件困扰我的事情就是语法的顺序.到目前为止,在所有typedef定义中,我们左边是类型,右边是别名.
typedef int number;
typedef struct
{
int num;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)
我们看到int和struct是左边的类型,我们给它们的别名是右边的.
现在,在指向函数typedef的指针中,它不遵循此约定.我们在右边的函数返回了类型,然后是括号中的typename,然后是括号中的参数类型,这个顺序让我在查看其他typedef如何处理相同的顺序后感到困惑.
做这样的事情会不会更有意义?:
typedef int (int,int) Func;所以我们首先得到一个typedef,我们想要给别名的类型,在这种情况下是一个函数签名,它取2个int并返回一个int,然后在右边我们有别名.它会更有意义吗?这跟随其他的typedef顺序,我只是没有得到那么多的函数指针顺序..
执行以下操作是否正确:
MyClass mc1(1, 1);
MyClass* pmc1 = &mc1;
delete pmc1;
Run Code Online (Sandbox Code Playgroud)
我在代码示例中看到了它.我以为我们可以在指向堆上分配的对象的指针上调用delete但是这个指针指向堆栈上的对象,不是吗?有人可以解释一下吗.
我无法弄清楚为什么,但这是我的代码:
char expression[256] = {};
cin >> expression;
cout << endl;
int** variableTable = NULL;
int numOfVals = getNumberOfVariables(expression);
variableTable = static_cast<int**>(calloc(numOfVals, sizeof(int*)));
for (int i = 0; i < numOfVals; i++)
{
variableTable[i] = static_cast<int*>(calloc(2, sizeof(int)));
}
fillPromoterTable(expression, variableTable, numOfVals);
Run Code Online (Sandbox Code Playgroud)
这是fillPromoterTable
void fillPromoterTable(const char* expression, int** variableTable, int numOfVals)
{
char promoter[15] = {};
char *token;
char* expCpy = pcstrdup(expression);
for (int i = 0; numOfVals; i++)
{
token = strtok(expCpy, "+-*/");
int nLen = istrlen(token);
for (int j …Run Code Online (Sandbox Code Playgroud) 我正在尝试从文件中读取字符,但陷入无限循环,这是代码:
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ifstream ifs("ifile.txt", ios_base::in);
int b;
while ((b = ifs.get()) != EOF)
{
cout << b << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我在正在创建 .exe 文件的项目 Debug 文件夹中创建了一个名为 ifile.txt 的文件(我使用的是 Microsoft Visual Studio 2013)
当我运行它时,它陷入无限循环。不知道为什么会发生这种情况,但我认为它可能与我创建 ifile.txt 的地方有关?