这是一个使用结构数组的例子,总得来说没有什么特别的地方,
感觉有点像是二维数组
#include<stdio.h>
struct time{
int hour;
int minutes;
int seconds;
};
struct time timeUpdate(struct time now);
int main()
{
struct time testTimes[5] = {
{11,59,59},{12,0,0},{1,29,59},{23,59,59},{19,12,27}
};
int i;
for( i=0; i<5; ++i ){
printf("time is %2i:%2i:%2i\n",
testTimes[i].hour,testTimes[i].minutes,testTimes[i].seconds);
testTimes[i] = timeUpdate(testTimes[i]);
printf("...one second later it's time is %2i:%2i:%2i\n",
testTimes[i].hour,testTimes[i].minutes,testTimes[i].seconds);
}
return 0;
}
struct time timeUpdate(struct time now){
++now.seconds;
if(now.seconds == 60){
now.minutes++;
now.seconds=0;
}
if(now.minutes == 60){
now.hour++;
now.minutes=0;
}
return now;
}
结构中的结构
struct point {
int x;
int y;
};
struct rectangle{
struct point pt1;
struct point pt2;
};
如果有变量
struct rectangle r;
就可以有:
r.pt1.x,r.pt1.y;
r.pt2.x,r.pt2.y;
如果有变量定义
struct rectangle r ,*rp;
rp=&r;
那么下面四种形式就是等价的:
r.pt1.x
rp->pt1.x
(r.pt1).x
(rp->pt1).x
联合
typedef
声明新的类型的名字
新的名字是某种类型的名别
改善了程序的可读性
本来是以为C语言学到指针,去学单片机就没什么问题了
之前在学单片机矩阵按键的时候,遇到了很大的困难
找不到程序的问题在哪里,逻辑也没有问题,还遇到了一些很奇怪的问题
于是找了社团的程序,发现社团的程序有很多地方看不懂
比如程序中的 uint8 等等,于是决定C语言需要继续学下去,
然后结合社团的程序重新学单片机,虽然时间可能不太够,
但是,寒假能学多少就多少吧
typedef int length;
这句话的意思就是,以后 length 也可以代表 int
以后程序中只要出现 length 表示的就是 int
length a,b,len;
length number[10];
完全可以这样
typedef long int64;
这样 int64 就是long这个型别了;
可以增强可读性
typedef struct adate{
int month;
int day;
int year;
}date;
上面这几行程序的意思是
struct adate{
int month;
int day;
int year;
};这部分是一个结构,它的名字是date,
以后date就是一个有month,有day,有year的一个结构了
我们可以直接
date d = {9,1,2013};
可以每次用到 struct date时直接将 struct 省略
再举一个例子
typedef char* strings[10];
表示的是strings是十个字符串数组的类型
这里的strings不再是数组了,而是一个类型
联合 union
union AnElt{
int i;
char c;
}elt1,elt2;
看上去好像和 struct 没有什么不同,我们照样可以对它做赋值
elt1.i = 4;
elt2.c = 'a';
elt2.i = 0xdeadbeef;
实际上,union AnElt{
int i;
char c;
}elt1,elt2;,这里的 i 和 c 是公用一个内存的,
感觉就好像是申请的一段内存,这段内存由这个联合内的成员共同使用
并且同一时间只能存其中一个成员的值
那这段空间有多长?
这段空间的长度是 这个联合中 长度最长的型别的整数倍
举个例子
union foo{
int i;
long j;
char f;
}bar;
这里 bar 就是这个联合的名字,里面有 i , j , f
而这个联合所占的空间, 是 long 的整数倍,这个例子中就是 8个字节
union foo{
int i;
char j[10];
}bar;
这个联合所占的空间是 12 是 int 的长度的三倍,而不是 j[10] 的长度
如果,我们将这里的 int ,换成 long 那这个联合的长度就是 16
是 long 的 2 倍
|