Linux C语言程序设计(四)——枚举与结构体

原创 2015年07月09日 20:37:29

1、结构体

        结构体不同于我们之前了解到的基本数据类型,结构体数据类型是一种复合数据类型,它可以包括一些基本的数据类型。

        复合数据类型一方面可以从整体上当作一个数据使用,另一方面也可以分别访问它的各组成单元,复合数据类型的这种两面性提供了一种数据抽象。如果学习过java这样的面向对象的语言,会对结构体这样的抽象数据结构了解得比较深刻。比如,如果我们在二维坐标系上有一个点,那么如何描述这个点呢?很显然,它有横坐标和纵坐标,我们使用x和y表示。比如(5,2)就表示横轴为5,纵轴为2。换到我们的程序语言中,单纯的整形或者浮点型这样的单一数据结构已经无法满足需求,我们需要寻找另外的一种方式。

那么这个时候,我们的结构体就用上了,我们可以使用如下的数据结构:

struct point_struct {
	double x, y;
};

point_struct 表示的是点这个对象名称,这里我们称之为结构体对象名称。其中的x和y分别代表横纵坐标,如果我们想声明两个点a、b,那么我们会使用如下的代码:

struct point_struct a,b;

我们来看一段实例代码,如下:

#include <stdio.h>
int main(void)
{
	struct point_struct { double x, y; } z;
	double x = 3.0;
	z.x = x;
	z.y = 4.0;
	if (z.y < 0){
		printf("z=%f%fi\n", z.x, z.y);
	}else{
		printf("z=%f+%fi\n", z.x, z.y);
	}
	return 0;
}

2、数据抽象

数据抽象是一个比较难解释的概念,我们上文讲到如何使用结构体描述一个点,这里我们将介绍,如何使用结构体来抽象一个函数。

我们知道,在C语言中,前辈先人为我们封装了很多不同的函数库,其中数学函数库是非常大的一类,我们也经常使用。比如我们要做两个数的加减乘除,就可以找到相应的函数来计算,而不必再手动造轮子。但是学习要究其原理,我们今天就来手动造一个加减乘除的轮子。

如上,我们应该先描述一个点,我们暂且将两个数放在一起称之为点,与上文一致,不再描述。我们定义一些函数,加减乘除,举例加法的函数如下:

double addFunc(struct point_struct num){
	return num.x + num.y;
}

如上,我们传递一个结构体数据类型给这个addFunc函数,使用它的x点和y点数值进行相加,然后返回给调用者。我们测试一下:

#include <stdio.h>
int main(void)
{
	struct point_struct { double x, y; } z;
	
	z.x = 3.0;
	z.y = 4.0;

	printf("z=%f\n", addFunc(z));

	return 0;
}


3、枚举标志

        在上文中,我们使用了两次结构体这样的概念,一次是点,一次是类似点(两个是相互独立的数字)。那么,既然这个数据结构可以同时适用于两种不同的应用场景,我们能不能将之合并使用,而用一个标志位来进行一定的区分呢?答案是肯定的。

        于是这里就引入我们的枚举类型,如下:

enum coordinate_type { POINT, NUM };
struct complex_struct {
	enum coordinate_type t;
	double a, b;
};

        enum关键字的作用和struct关键字类似,把coordinate_type这个标识符定义为一个Tag,只不过struct complex_struct表示一个结构体类型,而enum coordinate_type表示一个枚举类型。

        枚举类型的成员是常量,它们的值编译器自动分配,例如定义了上面的枚举类型之后, RECTANGULAR就表示常量0, POLAR就表示常量1。


有一点需要注意,结构体的成员名和变量名不在同一命名空间,但枚举的成员名和变量名却在同一命名空间,所以会出现命名冲突。如下的命名就是不合法的:

int main(void)
{
	enum coordinate_type { RECTANGULAR = 1, POLAR };
	int RECTANGULAR;
	printf("%d %d\n", RECTANGULAR, POLAR);
	return 0;
}

4、嵌套结构体

        结构体也是一种递归定义:结构体由数据类型定义,因为结构体的成员具有数据类型,而数据类型由结构体定义,因为结构体本身也是一种数据类型。换句话说,结构体也可以嵌套。例如我们在复数的基础上定义复平面上的线段:

struct Segment {
	struct complex_struct start;
	struct complex_struct end;
};

嵌套结构体可以嵌套地初始化。例如:

struct Segment s = {{ 1.0, 2.0 }, { 4.0, 6.0 }};


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C语言详解 - 枚举类型

如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。    举个例子来说明一吧,为了让大家更明白一点...

Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

本篇经过博主同意方才转载,原文地址:http://blog.csdn.net/qq_26787115/article/details/51225368 Android For JNI...

黑马程序员——4、C语言(结构体、枚举)

一、jie'g

Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我...

C语言——结构体、局部变量和全局变量、枚举

局部变量与全局变量    按照作用域不同将变量分为 局部变量和全局变量    局部变量:定义在函数内部变量    作用域:从定义的那一行开始直到所在代码结束    生命周期:从定义的那一行开始...

C语言基础学习——第9天(结构体、联合、枚举)

C语言基础学习——第9天(结构体、联合、枚举)

C语言回顾(八、结构体,联合/共用体,枚举)——iOS开发基础

整理C语言知识点(不是细节,知识个人觉得较重要或易忘的)以及挑一些课后题目或经典习题编写代码练习。 结构体,枚举,共用体/联合,iOS开发基础……
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)