C语言——结构学习笔记_干货哦!

今天读书读到了一句话,分享给大家:岳飞回则回矣,何必十二道金牌枉催!该做的事就抓紧做,不要拖延。

好啦,进入正题:

C语言的结构类型——可以创建一个自己的复合数据类型。

1.声明结构类型:

struct student_date
	{
		char name[NAME_LEN + 1];
		int age;
		int grade;
	};//这里的 ; 不要丢掉!!!

这里面的 name、age、grade都是结构student_date的成员。

struct student_date liming; //定义一个变量liming,类型为student_date

	strncpy(liming.name,"liming",sizeof(liming.name) - 1);
	liming.name[sizeof(liming.name) - 1] = '\0';//其实如果liming.name足够长直接用strcpy就可以了

	liming.age = 18;
	liming.grade = 1;

注意:

字符数组赋值除了赋初值其他场合不能用=赋值,所以这里用的strcpy/strncpy来给它赋值!

字符指针可以 随时用=赋值!
 

还可以直接在声明结构时就定义此结构变量(比较常用):

struct student_date
	{
		char name[NAME_LEN + 1];
		int age;
		int grade;
	}liming,xiaohong,Jane;//这里的 ; 不要丢掉!!!

2.关于结构声明在(主)函数内/外的问题:

1>.结构和本地变量一样,在函数内部声明的结构类型只能在函数内部使用

2>.所以通常在函数外部声明结构类型,这样就可以被多个函数使用了

3.struct无名结构(这种结构我理解为一次性定义结构变量)

struct{
    int x;
    int y;
}p1,p2;

4.结构可以在初始化时用{}

struct student_date liming = {"liming",18,1};

struct student_date Kangkang = {.name = "Kangkang",.grade = 1};//这里发现少了个age,没有初始化就会认为是0

5.结构成员(可以不是同一种类型,从上面就可以看出来了吧!)

使用运算符 . 来访问结构的成员

6.结构运算

1>要访问整个结构,直接用结构的名字

2>对于整个结构,可以做赋值取地址,也可以传参给函数。

如:

	struct student_date
	{
		char name[NAME_LEN + 1];
		int age;
		int grade;
	}liming;//这里的 ; 不要丢掉!!!
	
	liming = (struct student_date){"liming",18,1};

	struct student_date liming2;

	liming2 = liming;//赋值。而数组只能在初始化时赋初值,不可以后续做赋值运算 如: a[2] = {3};×

3>结构变量名字不是地址,需要&取地址符

	struct student_date *pliming = &liming;
	printf("%s\n",(*pliming).name);

 这里先是声明了一个指向结构体的指针(结构体指针)

结构体指针可以访问结构体成员:(*point).member;

结构体指针可以作为函数参数(开销小)

7.作为函数参数

比如 int f (struct student_date liming);

1>此时整个结构都会作为参数传入函数,过程就是函数内新建了一个结构变量,并复制了一遍再调用结构的值

2>可以返回一个结构

3>对于结构的输入:

scanf不能一次输入一个结构,但是我们可以自己去写一个my_scanf的函数去读取一个结构,再返回一个结构(不过开销较大)

4>结构体指针作为参数:

对于一种大的结构更加高效的办法就是传指针!(前面说过了无论是传参传入一个结构还是返回一个结构,它都是复制了一个,开销很大)

创建一个结构体指针如下:

struct date{
    int month;
    int day}myday;

struct date *p = &mydate;

使用结构体指针去修改结构体成员的值:

(*p).month = 12;

p -> month = 12;

这两种形式都是可以的,两者是等价的。( 注:-> 表示指针指向结构变量中的成员)

5>常用的一个小套路:

struct point{
    int x;
    int y;
};//定义了一个 点 结构(x,y)
struct point* getstruct (struct point *p)//函数getstruct传入的是指针,返回的也是指针
{
    scanf("%d",&p->x);
    scanf("%d",&p->y);

    return p;//返回指针
}

8.结构中的结构

1>

struct point{
    int x;
    int y;
};//表示一个点(x,y)
struct rectangle{
    struct point point1;
    struct point point2;
};//左上角一个点右下角一个点足以确定一个矩形(rectangle)

struct rectangle rectangle1;//定义了一个rectangle变量rectangel1

这样去访问时就有了:

rectangle1.point1.x

2>

struct rectangle rectangle1,*p_rectangle;//有一个rectangel1,还有一个指针p_rectangle
    p_rectangle = &rectangle1;//指针p_r指向r

则 p_rectangle -> point1.x  与 rectangle1.point1,x 与 (p_rectangle->point1).x 三者等价!

3>还有结构中的数组......等等自己去组合吧!

好啦,晚安~~

猜你喜欢

转载自blog.csdn.net/qq_51182221/article/details/115286032