为什么这个结构是通过参数发送的?

时间:2015-05-24 12:17:27

标签: c visual-studio data-structures parameter-passing pass-by-reference

我正在使用DES算法的结构:

typedef struct {
    int size;
    int capacity;
    unsigned char *block;
}Blocks64;

我已经做了很多事情,所以我有一些关于unsigned char的信息。我在函数中称之为迭代,我需要通过参数发送它,所以我可以在函数中修改它,并且更改保留在结构上,所以据我所知,这是这样做的方法:

void iterations(Block64 *blocks){
   printf("This is the first char: %c",get_64bBlocks_char(&blocks,0,0));
}

在方法中,我有一个printf();,所以我可以检查它与我发送的那个相同......但事实并非如此。在我调用迭代的函数上,我有相同的代码:

printf("This is the first char: %c",get_64bBlocks_char(&blocks,0,0));

它打印出我存储在其中的内容,但在迭代方法中却没有。

所以只是测试,我这样做了:

void iterations(Block64 blocks){
   printf("This is the first char: %c",get_64bBlocks_char(&blocks,0,0));
}

现在我正确收到了!如果我在迭代方法中进行更改,它会影响方法之外的方法。我真的不明白!据我所知,我必须使用指向结构的指针,以便我可以通过引用传递它。我的编译器现在是Visual Studio 2015。

1 个答案:

答案 0 :(得分:1)

因为您传递的指针地址(不是struct的地址),只需删除第一个版本中的&

void iterations(Block64 *blocks)
{
   printf("This is the first char: %c", get_64bBlocks_char(blocks, 0, 0));
}

因为你传了一个指针,所以你不需要把它的地址传递给get_64bBlocks_char()

如果您打开了编译器警告,那么编译器会告诉您get_64bBlock_char()的第一个参数是不兼容的类型,因为Block64 **运算符为&

第二种情况,不会按照您的意愿工作,因为该函数将处理结构的副本,因此,在函数返回后不会保留对它所做的更改,因为副本是deallocated,也因为你需要它来处理必须传递地址的原件才能被修改。