[C语言笔记]11、结构体
前言:
C语言的相关知识点的笔记均在下面的专栏链接中,欢迎订阅!
c语言笔记_1zero10的博客-CSDN博客
11-1结构体的定义和使用(创建)
法1:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
//1、结构体的定义//格式:struct 结构体名 {结构体成员变量列表};
struct Book {char name[100];double price;int value;
};
int main() {
//2、结构体的使用//2-1、法1:struct 结构体名 变量名;struct Book c;strcpy(c.name, "c语言从入门到精通");c.price = 999;c.value = 1000000;printf("%s的价格是:%.2lf 价值是:%d\n", c.name, c.price, c.value);return 0;
}
法2:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
//1、结构体的定义//格式:struct 结构体名 {结构体成员变量列表};
struct Book {char name[100];double price;int value;
};
int main() {
//2、结构体的使用//2-2、法2:struct 结构体名 变量名 = {初始化列表};struct Book py = { "python入门到精通",999,100000 };printf("%s的价格是:%.2lf 价值是:%d\n", py.name, py.price, py.value);return 0;
}
法3:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
//1、结构体的定义//格式:struct 结构体名 {结构体成员变量列表};
struct Book {char name[100];double price;int value;
}cpp;
int main() {
//2、结构体的使用//2-3、法3:直接创建strcpy(cpp.name, "c语言零基础编程");cpp.price = 399;cpp.value = 10000;printf("%s的价格是:%.2lf 价值是:%d\n", cpp.name, cpp.price, cpp.value);return 0;
}
11-2结构体数组
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
//1、结构体的定义
struct Book {char name[100];double price;int value;
};
int main() {//2、结构体数组的定义//格式:struct 结构体名 数组名[元素个数]={{},{},{}...};struct Book books[3] = {{"c语言程序设计",999,10000},{"python零基础到精通",999,10101},{"c++零基础编程",399,9999},};//3、修改结构体数组的元素strcpy(books[2].name, "c++从入门到入土");//4、循环遍历输出结构体数组for (int i = 0; i < 3; ++i) {struct Book tmp = books[i];printf("%s的价格是%.2lf 价值是:%d\n", tmp.name, tmp.price, tmp.value);}return 0;
}
11-3结构体指针
作用就是有效的修改单个人为创建的结构体的成员的值
比如
定义结构体:
struct Book { char name[100]; double price; int value; };
创建结构体
struct Book b={"c语言入门到精通",999,100000};
那么现在你需要把b中999 改成399.99如何修改
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
//1、结构体的定义
struct Book {char name[100];double price;int value;
};
int main() {//2、结构体指针的创建 //格式 struct 结构体名 * 变量名 =&结构体变量;struct Book b = { "c语言程序入门到精通",999,100010 };struct Book* pb = &b;//3、修改b的值 两种修改方法(*pb).price = 399.99;pb->value = 10000;printf("%s的价格是%.2lf 价值是:%d\n", b.name, b.price, b.value);return 0;
}
11-4嵌套结构体
1、利用嵌套结构体
输出下面这句话
一个圆心坐标为(9,8),半径为5的圆
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//1、结构体的定义
struct Point {double x, y;
};
struct Circle {struct Point pt;//把定义圆心坐标的结构体Point 定义一个结构体变量pt嵌套进Circle结构体里 int radius; // 半径
};
int main() {struct Circle c; c.pt.x = 9;c.pt.y = 8;c.radius = 5;printf("这是一个圆心坐标为:(%.0lf,%.0lf),半径为:%d 的圆\n", c.pt.x, c.pt.y, c.radius);return 0;
}
2、利用嵌套结构体
达到以下题目要求:
现在有两个圆
要输出
这是一个圆心坐标为(9,8),半径为5的圆
这是一个圆心坐标为(2,1),半径为1的圆
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//1、结构体的定义
struct point {double x, y;
};
struct circle {struct point pt;//把定义圆心坐标的结构体Point 定义一个结构体变量pt嵌套进Circle结构体里 int radius; // 半径
};
struct circles {int size;struct circle c[100];
};
int main() {struct circles cs = {2,{{{9,8},5},{{2,1},1}}};for (int i = 0; i < cs.size; ++i) {struct circle tmp = cs.c[i];printf("这是一个圆心为:(%.0lf,%.0lf),半径为:%d 的圆\n", tmp.pt.x, tmp.pt.y, tmp.radius);}return 0;
}
11-5结构体作为参数传函数内部
结论:和变量作为参数传进函数道理一样
如果变量/结构体传进函数后需要对它的值进行修改 就得用址传递 即传入变量/结构体的指针
如果变量/结构体传进函数后不需要对它的值进行修改 就得用值传递 即传入变量/结构体本身
例:
用结构体定义一个 圆心坐标为(9,8)半径为5 的圆
然后定义movecircle函数用来修改圆心坐标和半径的值 横坐标+2 纵坐标-1 半径+3
再定义printcircle函数打印出新的圆心坐标和半径
#include <stdio.h>
struct circle {int x, y;int radius;
};
void movecircle(struct circle* c,int a, int b, int m) {(*c).x += a; (*c).y -= b;(*c).radius += m;/*也可写成这样c->x += a;c->y -= b;c->radius += m;*/
}void printcircle(struct circle c) {printf("新的圆的圆心坐标为:(%d,%d)半径为:%d", c.x, c.y, c.radius);
}int main() {struct circle c = { 9,8,5 };movecircle(&c, 2, 1, 3);printcircle(c);return 0;
}