翁凯C语言之结构体复习

结构体

结构体很久没用,复习一下

示例引入

#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;

你可能感兴趣的:(学习,c语言,java,算法,结构体)