Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C结构中的访问变量_C_Function_Struct_Typedef - Fatal编程技术网

C结构中的访问变量

C结构中的访问变量,c,function,struct,typedef,C,Function,Struct,Typedef,我不太熟悉C编程,我必须对源代码做一些修改,问题是: 我在头文件中有这个: typedef struct word { long wnum; float weight; } WORD; typedef struct svector { WORD *words; double norm; } SVECTOR; 在我的file.c中,我有一个函数 double function(SVECTOR *a, SVECTOR *b){ } 我应该如何在函数中访问wnum和权

我不太熟悉C编程,我必须对源代码做一些修改,问题是: 我在头文件中有这个: typedef struct word { long wnum; float weight; } WORD;

typedef struct svector { WORD *words; double norm; } SVECTOR; 在我的file.c中,我有一个函数

double function(SVECTOR *a, SVECTOR *b){ } 我应该如何在函数中访问wnum和权重变量??? 提前感谢

Edit:added words,在我急于解释各种延迟运算符时,我错过了有两个嵌套结构的事实。。。 i、 最初的反应就像一些长的变量a->wNum;这当然是错误的

第二次尝试-

some_long_var = a->words->wNum;
//  or
some_float_var = a->words->weight;
我们应该做到这一点

因为a和b是指针,所以需要先解除对它们的引用,然后才能访问它们的成员。->操作符同时执行这两项操作

或者你可以做一些类似的事情

some_long_var = a[0].words->wNum;
或者,如果希望a是数组,则可能使用值大于0的下标。关键是,在C语言中,数组通常被视为指向数组中元素类型的指针,因此[]数组运算符在功能上和语义上都是对指针进行解引用的正确方法

最后,但这更为人为,但对于理解各种c运算符背后的语义非常有用,您可以分两个步骤来完成,其中*运算符执行解引用操作,成员运算符执行。获取所需的结构/类成员:

some_long_var = (*a).words->wNum;
编辑:添加文字,在我急于解释各种延迟运算符时,我错过了有两个嵌套结构的事实。。。 i、 最初的反应就像一些长的变量a->wNum;这当然是错误的

第二次尝试-

some_long_var = a->words->wNum;
//  or
some_float_var = a->words->weight;
我们应该做到这一点

因为a和b是指针,所以需要先解除对它们的引用,然后才能访问它们的成员。->操作符同时执行这两项操作

或者你可以做一些类似的事情

some_long_var = a[0].words->wNum;
或者,如果希望a是数组,则可能使用值大于0的下标。关键是,在C语言中,数组通常被视为指向数组中元素类型的指针,因此[]数组运算符在功能上和语义上都是对指针进行解引用的正确方法

最后,但这更为人为,但对于理解各种c运算符背后的语义非常有用,您可以分两个步骤来完成,其中*运算符执行解引用操作,成员运算符执行。获取所需的结构/类成员:

some_long_var = (*a).words->wNum;
a->words->wnum

->这两种方法都会取消对指针的引用,并允许您引用结构的字段。

a->words->wnum


->这两种方法都会取消对指针的引用,并允许您引用结构的字段。

请确保检查空指针,但通常是:

a->words->wnum
a->words->weight
因为,它被称为单词,听起来像是一个数组检查代码来确定。您可能需要在阵列上循环。如果您可以显示更多代码或指向一些文档,我们就可以知道该数组的大小

for( unsigned int t = 0; t < [SIZE OF words ARRAY]; ++t )
{
   a->words[t].wnum;
   a->words[t].weight;
}

确保检查空指针,但通常是:

a->words->wnum
a->words->weight
因为,它被称为单词,听起来像是一个数组检查代码来确定。您可能需要在阵列上循环。如果您可以显示更多代码或指向一些文档,我们就可以知道该数组的大小

for( unsigned int t = 0; t < [SIZE OF words ARRAY]; ++t )
{
   a->words[t].wnum;
   a->words[t].weight;
}
你可以通过:

a->words->wnum
a->words->weight
或:

取决于您收到的函数的实际参数

如果收到指向单个SVECTOR元素的指针,则可以使用第一种方法。 另一方面,如果您收到指向服务器SVECTOR元素的指针,您可能会发现第二种方法更方便。 你可以通过:

a->words->wnum
a->words->weight
或:

取决于您收到的函数的实际参数

如果收到指向单个SVECTOR元素的指针,则可以使用第一种方法。 另一方面,如果您收到指向服务器SVECTOR元素的指针,您可能会发现第二种方法更方便。
您有一个指向单词定义类型的指针,因此:

a->words->(member)
如果您只是有一个not pointer成员,您应该执行以下操作:

a->words.(member) 

您有一个指向单词定义类型的指针,因此:

a->words->(member)
如果您只是有一个not pointer成员,您应该执行以下操作:

a->words.(member) 

根据SVECTOR和words的名称,听起来像是在处理数组。以下是一些变体:

/**
 * a and words are meant to be treated as arrays
 */
a[i].words[j].wnum = ...;
a[i].words[j].weight = ...;
/**
 * a is treated as an array, words is not
 */
a[i].words->wnum = ...;
a[i].words->weight = ...;
/**
 * a is not treated as an array, words is
 */
a->words[j].wnum = ...;
a->words[j].weight = ...;
/**
 * a and words are not treated as arrays
 */
a->words->wnum = ...;
a->words->weight = ...;
那么为什么要使用。当我们应用下标时->当我们不应用时?首先,请记住,在通过指针和访问结构的成员时使用->。通过结构实例访问成员时。数组下标操作定义为a[i]==*a+i;下标的行为有效地解除了指针的引用。因此,单词的类型是struct word*指向struct word的指针,单词的类型[i]是struct word。因此,对于前者和后者,我们需要使用->。对于后者。同样的道理适用于a和b


如果要将a、b或字视为数组,则它们的大小必须在某处已知

根据SVECTOR的名字和单词,听起来你像是被 使用数组进行处理。以下是一些变体:

/**
 * a and words are meant to be treated as arrays
 */
a[i].words[j].wnum = ...;
a[i].words[j].weight = ...;
/**
 * a is treated as an array, words is not
 */
a[i].words->wnum = ...;
a[i].words->weight = ...;
/**
 * a is not treated as an array, words is
 */
a->words[j].wnum = ...;
a->words[j].weight = ...;
/**
 * a and words are not treated as arrays
 */
a->words->wnum = ...;
a->words->weight = ...;
那么为什么要使用。当我们应用下标时->当我们不应用时?首先,请记住,在通过指针和访问结构的成员时使用->。通过结构实例访问成员时。数组下标操作定义为a[i]==*a+i;下标的行为有效地解除了指针的引用。因此,单词的类型是struct word*指向struct word的指针,单词的类型[i]是struct word。因此,对于前者和后者,我们需要使用->。对于后者。同样的道理适用于a和b


如果要将a、b或字视为数组,则它们的大小必须在某处已知

实际上,不是。a变量是指向SVECTOR的指针,而不是单词。正如Heinzi所示,您需要通过其words字段进行间接操作。实际上,不是。a变量是指向SVECTOR的指针,而不是单词。正如Heinzi所示,你需要通过它的单词字段进行间接转换。a和单词可能都是指向数组的指针,我们无法从我们看到的代码中分辨出来。当然,我认为它是一个数组。。。但是我没有得到你的for循环??添加了一些注释并显式地检查了w与0 NULLUmmm的对比-如果单词是单词**,你的循环就可以工作。因为它是你的,你会一直坚持下去,直到你认错为止。->words指向一块足够容纳一个或多个单词结构的内存++w增加w的大小。“我们怎么会是0呢?”sdtom。说得好。现在要删除该代码@jamel你能告诉我单词是如何分配的吗?a和单词都可能是指向数组的指针,我们从看到的代码中看不出来。当然,我认为它是一个数组。。。但是我没有得到你的for循环??添加了一些注释并显式地检查了w与0 NULLUmmm的对比-如果单词是单词**,你的循环就可以工作。因为它是你的,你会一直坚持下去,直到你认错为止。->words指向一块足够容纳一个或多个单词结构的内存++w增加w的大小。“我们怎么会是0呢?”sdtom。说得好。现在要删除该代码@jamel你能说明单词是如何分配的吗?作为提示,不要给结构单词命名。这是无符号short的常见定义。很久以前,两个字节被称为单词。这是库代码中的常见定义,尤其是Windows代码。作为提示,不要命名结构词。这是无符号short的常见定义。很久以前,两个字节被称为单词。这是库代码中的常见定义,尤其是Windows代码。我认为单词是一个数组。你知道一种获取其大小的方法,这样我就可以在其上循环吗?根据你发布的代码,不知道。单词指针没有任何关于它指向的块大小的信息。根据您发布的内容,很可能有一个全局变量或宏定义来保存这些信息,但最好询问了解代码应该如何工作的人。我认为单词是一个数组。你知道一种获取其大小的方法,这样我就可以在其上循环吗?根据你发布的代码,不知道。单词指针没有任何关于它指向的块大小的信息。根据您发布的内容,可能有一个全局变量或宏定义来保存这些信息,但最好询问了解代码应该如何工作的人。