为什么这个结构是由参数发送的?
Why is this structure being sent by parameter?
我正在为我的 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.
因为你传递的是指针的地址,不是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 **
与 &
运算符。
第二种情况不会像您希望的那样工作,因为该函数将在结构的副本上工作,因此,对它所做的更改不会在函数执行后保留 returns],因为副本已被解除分配,还因为您需要它处理必须传递其地址才能修改的原件。
我正在为我的 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.
因为你传递的是指针的地址,不是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 **
与 &
运算符。
第二种情况不会像您希望的那样工作,因为该函数将在结构的副本上工作,因此,对它所做的更改不会在函数执行后保留 returns],因为副本已被解除分配,还因为您需要它处理必须传递其地址才能修改的原件。