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_Pointers_Struct - Fatal编程技术网

结构点作为函数C的参数

结构点作为函数C的参数,c,pointers,struct,C,Pointers,Struct,我有几个月的时间开始用C编程,但现在我发现自己有一个疑问,例如,让我们看下一个示例代码: typedef struct { char *var1; }myFooStruct; myFooStruct struct1 [ 200 ]; 我的疑问是**struct1,&struct1,*struct1,struct1, 当我将结构传递给一个采用二维指针(**myFooStruct)的函数时,我对指针1有了基本的了解,但我发现自己被结构的指针弄糊涂了

我有几个月的时间开始用C编程,但现在我发现自己有一个疑问,例如,让我们看下一个示例代码:

    typedef struct
    {
        char *var1;
    }myFooStruct;

    myFooStruct struct1 [ 200 ];
我的疑问是**struct1,&struct1,*struct1,struct1, 当我将结构传递给一个采用二维指针(**myFooStruct)的函数时,我对指针1有了基本的了解,但我发现自己被结构的指针弄糊涂了,2-如果我将结构作为at参数传递给函数,我如何修改它


如果还有其他类似的问题,请发到这里,我找不到任何类似的,如果你知道一些讲座我也可以读,非常感谢

如果需要从函数访问
myFooStruct
,可以定义单指针:
fn(myFooStruct*st)
。使用
fn(struct1)
调用函数并更改值
st[N]。var1=…
。如果您的对象是具有分配内存的指针,而不是您的静态数组,则可能需要双指针

方法1使用动态内存分配。通常用于链表和所有

如果要修改另一个函数中的
结构
。首先声明指向
结构的指针

myFooStruct* struct1;
myFooStruct struct1;
为结构分配内存

struct1 = malloc(sizeof(myFooStruct));
将地址发送到函数

func1(struct1);
func1(&struct1);
接收并访问它以在函数中进行修改

void func(myFooStruct* struct1)
{
    (*struct1).member1 = ...; // whatever you wanna do
    ...
void func(myFooStruct* struct1)
{
    (*struct1).member1 = ...; // whatever you wanna do
    ...
方式2

声明一个
结构

myFooStruct* struct1;
myFooStruct struct1;
结构的地址发送到函数

func1(struct1);
func1(&struct1);
接收并访问它以在函数中进行修改

void func(myFooStruct* struct1)
{
    (*struct1).member1 = ...; // whatever you wanna do
    ...
void func(myFooStruct* struct1)
{
    (*struct1).member1 = ...; // whatever you wanna do
    ...

struct1
只是一个表,具体来说,它只是指向内存中某个位置的指针

*struct1
将是struct1指向的对象,因此它是结构表中的第一个结构

但是
**struct1
不会是任何字符串。首先,不为字符串分配内存,第二个字符串是此结构的成员,而不是结构本身**结构是未定义的行为,仅此而已

&struct
是指向表的指针,因此它是指向指针的指针,指向表中的第一个结构

你必须自己决定你想要什么。如果要传递结构的表,最干净的方法是:

void function(myFooStruct structTab[]);

1。您应该向函数传递一个
struct指针
,以访问其中的
struct

声明一个结构指针-

myFooStruct *struct1;
为结构分配内存

struct1 = malloc(sizeof(myFooStruct));
并将其传递给声明为-

 type fn(myFooStruct *struct1){
     .....
     }
像这样调用这个函数-

fn(struct1);
像这样访问结构成员-
struct->member1

2.您还可以传递您现在声明的内容

myFooStruct struct1[ 200 ];
将函数定义为-

type fn(myFooStruct struct1[]){
.....
}
像这样访问结构成员-
struct[i]。member1

*
是一个解引用运算符-可以将其理解为“包含在位置xyz处的值”

&
是一个引用运算符-可以将其理解为“变量xyz在内存中的位置”

因此:

myFooStruct struct1
是一个物理结构-这是实际对象

&struct1
相当于
struct1
在内存中的位置-这通常是一个地址(如
0xf0004782
)。在通过引用传递(有关更多信息,请参阅Wikipedia)或分配给指针(指针字面上指向内存中的某个位置,明白吗?)

*struct1
取消引用
struct1
——也就是说,它返回位置
struct1
中包含的值。在您给出的示例中,这是无效的,因为
struct1
不是指向内存中某个位置的指针

**struct1
很复杂-它返回包含在
struct1
中的位置处的值。换句话说:
struct1
指向内存中的某个位置。在那个位置是内存中另一个位置的地址!把它想象成一次拾荒者狩猎——你去一个地方,找到一条线索,然后跟着它去另一个地方


关于如何访问结构:将结构看作一个盒子。当你面前有一个盒子时,你只需要打开它看看里面是什么。在C语言中,我们使用
操作符来实现这一点:

myFooStruct *pointer_to_struct1 = &struct1
char *my_var = pointer_to_struct1->var1
//NOTE: the previous line is equivalent to:
//  char *my_var = (*pointer_to_struct1).var1
char*my_var=struct1.var1

当你面前没有盒子时——也就是说,你有一个指向结构的指针——你需要访问盒子所在的位置,然后才能看到里面的东西。在C中,我们有一个快捷方式-
->
操作符:

myFooStruct *pointer_to_struct1 = &struct1
char *my_var = pointer_to_struct1->var1
//NOTE: the previous line is equivalent to:
//  char *my_var = (*pointer_to_struct1).var1

通常不能合法地取消对结构的引用。如果您有
myFooStruct struct0
*struct0
是语法错误。因此,在您的代码中,
**struct1
也是一个语法错误。谢谢Chris!。。。。好了,伙计们,我很难选择答案,我选择了一个我认为更完整的问题,以我的观点来看,谢谢大家的回答!为什么要为struct动态分配内存?将struct传递给另一个函数不需要这样做。不,没关系。我只是想知道这是否有什么原因:)非常感谢!,我选择这个答案并不是因为你没有触摸**操作数,而是非常清楚,非常感谢@Javi9207没问题,兄弟,这与分数无关。这关系到你学到了什么,以及我们的努力如何帮助你。:)非常感谢!完整而清晰的回答!