结构体很久没用,复习一下
#include
int main(int argc,char const *argv[])
{
struct date{
int month;
int day;
int year;
};//分号不能少
struct date today;
today.month=07;
today.day=31;
today.year=2023;
printf("Today's date is %i-%i-%i.",today.year,today.month,today.day);
return 0;
}
"%i"是一种通用的整数格式说明符,它可以处理以不同进制表示的整数,例如十进制、八进制和十六进制。
C语言还提供了其他整数格式说明符,如
“%d”(用于十进制整数)
“%x”(用于十六进制整数)等
和本地变量一样,在函数内部声明的结构类型只能在函数内部使用,所以通常在函数外部声明结构类型,这样就可以被多个函数所使用。
#include
struct date{
int month;
int day;
int year;
};//分号不能少
int main(int argc,char const *argv[])
{
struct date today;
today.month=07;
today.day=31;
today.year=2023;
printf("Today's date is %i-%i-%i.",today.year,today.month,today.day);
return 0;
}
struct point{
int x;
int y;
};
struct point p1,p2;
p1和p2都是point,都有x,y
无名结构
struct{
int x;
int y;
}p1,p2;
struct point{
int x;
int y;
}p1,p2;
struct date today={07,31,2023};
struct date this month={.month=07,.year=2023};//day会被赋为0(类比数组)
和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算符
struct date *pDate = &today;
整个结构可以作为参数的值传入函数,这时候是在函数内新建一个结构变量,并复制调用者的结构的值。也可以返回一个结构。
int numberOfDays(struct date d)
C在函数调用的时候是传值的,在结构函数中scanf赋值后需要返回一个值
#include
struct point{
int x;
int y;
};
struct point getStruct(void);
void outStruct(struct point p);
int main(int argc,char const *argv[])
{
struct point y={0,0};
y=getStruct();
outStruct(y);
}
struct point getStruct(void)
{
struct point p;
scanf("%d",&p.x);
scanf("%d",&p.y);
printf("%d,%d\n",p.x,p.y);
return p;
}
void outStruct(struct point p)
{
printf("%d,%d",p.x,p.y);
}
lf a large structure is to be passed to a function, it is generally more efficient to pass a pointer than to copy the whole structure.
指向结构的指针
struct date{
int month;
int day;
int year;
}myday;
struct date *p=&myday;
(*p).month=12;
p->month=12;//等价上条语句,英文读作:p arrow month
用 -> 表示指针所指的结构变量中的成员。
利用传指针的思想修改上述输入结构中的程序
#include
struct point{
int x;
int y;
};
struct point* getStruct(struct point*);//第一个struct point*指函数的返回类型,第二个struct point*指传入函数的类型
void output(struct point);
void print(const struct point *p);
int main(int argc,char const *argv[])
{
struct point y={0,0};
getStruct(&y);
output(y);
// output(*getStruct(&y));//用*取出getStruct返回的东西
// print(getStruct(&y));
}
struct point* getStruct(struct point* p)
{
scanf("%d",&p->x);
scanf("%d",&p->y);
printf("%d,%d\n",p->x,p->y);
return p;
}
void output(struct point p)
{
printf("%d,%d",p.x,p.y);
}
void print(const struct point *p)
{
printf("%d,%d",p->x,p->y);
}
C语言提供了一个叫做 typedef 的功能来声明一个已有的数据类型的新名字。
比如:
typedef int Length;//Length等价于int类型
typedef char* Strings[10];//Strings等价于10个字符串的数组的类型
typedef struct node{
int date;
struct node *next;
}aNode;
//aNode等价于struct node
//也可以写成
typedef struct node aNode;