结构返回类型解释

时间:2017-10-14 03:52:38

标签: c

当我引用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包含许多数据类型的混合?

2 个答案:

答案 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并不是混合的。它包含多个独立的数据,每个部分都有自己的清晰类型。