下面的程序有两个结构。我不明白如何在使用指针时将值从一个结构变量传递到另一个结构变量

#include <stdio.h>

typedef struct {
 int c;
 char d;
}bob;

typedef struct {
int c;
char d;
}anna;

//expecting 'bob' type variable
void fun(bob *var2)
{

printf("var2->c=%d\n",var2->c);
printf("var2->d=%c\n",var2->d);

}

int main()

{
anna var1;
var1.c=2;
var1.d='c';
fun(&var1);//passing 'anna' type pointer
return 0;
}

…但如果我更改程序以使用普通变量传递值,则会产生编译错误。
#include <stdio.h>

typedef struct {
 int c;
 char d;
}bob;

typedef struct {
int c;
char d;
}anna;

//expecting a variable of type 'bob'
void fun(bob var2)
{

printf("var2.c=%d\n",var2.c);
printf("var2.d=%c\n",var2.d);

}

int main()

{
anna var1;
var1.c=2;
var1.d='c';
fun(var1);//passing a variable of type 'anna'
return 0;
}

这背后的逻辑是什么?

最佳答案

首先,第一个版本,确实警告过你。如果启用了正确的编译器选项,您将看到
source_file.c:在函数“main”中:
source_file.c:30:5:警告:从不兼容的指针类型传递“fun”的参数1

fun(&var1);//passing 'anna' type pointer
 ^

source_file.c:16:6:注意:应为“struct bob*”,但参数的类型为“struct anna*”
void fun(bob *var2)

也就是说,在代码的第一个版本中
//应为“bob”类型变量
错了!!它应该是(跟随强调)
//应为指向“bob”类型变量的指针
根据C规则,指向某个类型的指针可以转换为另一个类型,但并不总是定义结果。所以,代码编译器的第一个版本(带有警告)并运行。
在第二种情况下,annabob是不同的类型,因此在传递参数和接收参数时不可能进行内部更改。对于编译器来说,它们是不同的类型,编译器的行为也相应地不同。

关于c - 两个结构如何以这种方式工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38872006/

10-11 16:10