当我引用int func(int a,int b)
时,这意味着我们指的是将返回整数数据的函数。以下陈述的含义是什么:
struct datatype func(int a, int b);
我知道该函数将返回一个结构类型,但我究竟能如何解释它。我的意思是在整数返回类型的情况下,它返回一个整数,让我们说5;在第二种情况下,我应该期望什么样的数据,因为结构有时包含数据类型的混合?
例如:
struct datatype
{
int a;
float b;
char array[8];
int *ptr;
};
它会返回什么类型,因为struct包含许多数据类型的混合?
答案 0 :(得分:3)
当声明函数返回int
时,它会返回int
。
当声明函数返回double *
时,它返回double *
。
当声明函数返回struct datatype
时,它返回struct datatype
。
假设:
struct datatype
{
int a;
float b;
char array[8];
int *ptr;
};
struct datatype func(int a, int b);
你可以在另一个函数中编写这样的代码:
struct datatype rv = func(1, 2);
现在你可以使用rv
的任何和所有元素,因为返回值被复制到变量中,就像你写的一样:
double dv = sqrt(3.1415926538);
在所有这些示例中,函数返回声明要返回的类型的值。您可以保存返回值;你可以(但可能不应该)忽略它。在有限的上下文中,您可以立即将返回的值用作函数的参数,或者将返回值的一部分分配给适当类型的变量。请注意,您不能将&
(地址)运算符应用于函数调用的结果;它不是左值。
此代码说明了您可以使用的选项:
#include <stdio.h>
#include <string.h>
struct DataType
{
double d;
int i;
char s[20];
};
static struct DataType function(double a1, int a2, char *a3)
{
struct DataType rv;
rv.d = a1;
rv.i = a2;
strncpy(rv.s, a3, sizeof(rv.s));
rv.s[sizeof(rv.s)-1] = '\0';
return rv;
}
static void printer(struct DataType dt)
{
printf("d = %f; i = %d; s = [%s]\n", dt.d, dt.i, dt.s);
}
int main(void)
{
function(0, 0x0, "");
printer(function(3.14159265358979323844, 0x03C0, "Slice of the pie"));
printf("d = %f\n", function(2.71828182845904523536, 0x2203, "Existential").d);
struct DataType dt = function(1.61803398874989484820, 0x03A6, "Oh fie upon a phi");
printf("d = %f; i = %d; s = [%s]\n", dt.d, dt.i, dt.s);
double d = function(1.41421356237309504880, 0x221A, "I'm rooting for two").d;
printf("d = %f\n", d);
return 0;
}
该输出是:
d = 3.141593; i = 960; s = [Slice of the pie]
d = 2.718282
d = 1.618034; i = 934; s = [Oh fie upon a phi]
d = 1.414214
答案 1 :(得分:2)
struct
是产品类型。它包含其元素的每个的一个值,每个元素可以具有不同的类型。在内存中,它是一堆数据,每个元素一个,连续放置(粗略地)。 union
恰恰相反。它包含一个类型的一个值,但您不确切知道它是哪种类型,因为有多个选择。在内存中,它是一个包含一个模糊类型值的区域。
在您的示例中,func
会返回int
和一个float
和一个char[8]
和 int*
。
struct datatype data = func(...);
int int1 = data.a;
float fl = data.b;
char* ch = data.array;
int *int2 = data.ptr;
// Four values and four types in one package
在这个例子中,我们有一个联合:
union datatype
{
int a;
float b;
char array[8];
int *ptr;
};
union datatype func();
现在,func
会返回int
或一个float
或一个char[8]
或< / em>一个int*
,您决定在访问它时认为它是哪一个。
union datatype data = func();
if(testSomething1())
{
int int1 = data.a; // I think that func gave me an int, so I'll take it out
}
else if(testSomething2())
{
float fl = data.b; // I think func gave me a float in this branch
}
else if(testSomething3())
{
char* ch = data.array; // If testSomething3(), then func() returns a char[8]
}
else
{
int *int2 = data.ptr; // Otherwise, it's an int*
}
// One value with 4 choices of type.
// You can also do evil things like
// union { float f; int i } u;
// u.i = 500;
// something(u.f);
// Which reinterprets an int as a float. Sometimes that makes sense, but most times
// you've done something wrong.
union
是你称之为“混合型”的东西,因为union
的值的类型确实不明确。但是,struct
并不是混合的。它包含多个独立的数据,每个部分都有自己的清晰类型。