📄 复件 pointer_struct.cpp
字号:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
/***************************************
C 语言中的结构体,类似Java中的类 。
****************************************/
/****************
结构体(structure):
C语言允许一个组合项中包含若干个类型不同的数据项,称为结构体 。
*/
/****************
声 明:
struct 结构体名
{
成员列表
}[变量名列表];
// 成员列表也可以是一个结构体变量,即结构体可以嵌套结构体 。
*/
/****************
定义结构体类型的变量:
struct student student1,student2;
*/
/****************
内存分配:
在定义了结构体变量后,系统会为之分配内存单元,其大小为各个成员列表所占据的内存空间之和 。编译时只对变量分配空间,对类型是不分配空间的。
*/
/****************
对结构体变量的访问(引用):
结构体变量名.成员名
1:不能将一个结构体变量进行整体输入输出,只能对分别对各个成员进行输入和输出
2:如果成员本身又是一个结构体类型,则要用若干个成员运算符,一级一级的找到最低一级的成员,只能对最低级(基本数据类型)的成员赋值、运算、存取。
student1.birthday.year
其中“birthday”为嵌套在 student结构体内的结构体,student1 为结构体student类型的一个变量 。
*/
/****************
结构体数组:
类似 基本类型所对应的数组 ,如整形数组,其数组中各个元素在内存中联系存放 。
其初始化原则和基本类型数组初始化一样,初始化完一个元素再进行下一个元素的初始化。
*/
/****************
“.” 号优先级高于“++”运算,所以
“leader[i].count++” 等价于“(leader[i].count)++”
“.” 号优先级高于“*”运算,所以 (*p).no
“->” 号优先级高于“++”
*/
/****************
一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值就是结构体变量的起始地址 。指针变量也可以用来指向结构体数组中的元素 。
*/
/* 结构体类型定义*/
struct studentinfo
{
int no; //学号
char name[15]; //姓名
float score[3]; //三门课程的成绩
float avr; //平均成绩
};
typedef studentinfo STUDENT;
// struct studentinfo stu[50]; // 定义结构体数组
STUDENT stu[50]; // 定义结构体数组
/******* 结构体变量的初始化******/
void initStruct()
{
struct studentinfo std1 = {
102, "英泰", 99.3, 89.7, 100,(99.3 + 89.7 + 100)/3 };
struct studentinfo std;
std.no = 101;
strcpy(std1.name, "英泰");
// std.name = "英泰"; //error 无法从“const char [5]”转换为“char [15]”
std.score[0] = 99.3;
std.score[1] = 89.3;
std.score[2] = 69.6;
std.avr = (std.score[0] + std.score[1] + std.score[2])/3;
}
/******* 指向结构体的指针*******/
void structPointer()
{
struct studentinfo std = {
102, "英泰", 99.3, 89.7, 100,(99.3 + 89.7 + 100)/3 };
struct studentinfo *p;
p = &std;
// 通过结构体变量访问成员
printf("学号:%d\t, 姓名:%s\t,平均成绩:%5.2f\t\n", std.no, std.name, std.avr);
// 通过指针变量访问成员,方式一
printf("学号:%d\t, 姓名:%s\t,平均成绩:%5.2f\t\n", (*p).no, (*p).name, (*p).avr);
// “.” 号优先级高于“*”运算,所以使用“(*p)”
// “(*p)” :表示 p所指向的结构体变量
// “(*p).no” : 是p所指向的结构体变量中的成员 no
// 在C语言中,为了使用方便和直观,可以把“(*p).no” 改为“p->no”来代替,它表示“*p”所指向的结构体中的变量 no 。
// 通过指针变量访问成员,方式二
printf("学号:%d\t, 姓名:%s\t,平均成绩:%5.2f\t\n", p->no, p->name, p->avr);
printf("int 变量的内存空间大小:%d\n",sizeof(int));
printf("char数组 的内存空间大小:%d\n",sizeof(char)*15);
printf("float 变量的内存空间大小:%d\n",sizeof(float)*4);
printf("结构体变量的内存空间大小:%d\n",sizeof(std));
printf("%d\n" ,&std);
printf("%d\n", &(std.no));
printf("%d\n", &(std.name));
printf("%d\n", &(std.score[0]));
printf("%d\n", &(std.score[1]));
printf("%d\n", &(std.score[2]));
printf("%d\n", &(std.avr));
/*
1244416
1244416
1244420
1244436
1244440
1244444
1244448
*/
// 16 ~ 51 共 36 个字节
/*
1244852
1244852
1244856
1244872
1244876
1244880
1244884
*/
}
/******* 指向结构体数组的指针*******/
void structArrayPointer()
{
/* 基本数据类型定义 */
int count=0;
char ch='y';
struct studentinfo studentinput();// 先声明
while ((ch=='y') || (ch=='Y'))
{
stu[count]=studentinput(); // 后使用
count++;
printf("\n 是否继续?(y or n)");
scanf(" %c",&ch);
}
struct studentinfo *temp;
struct studentinfo *p; // 声明
p = stu; // 初始化等于结构体数组的首地址
temp = p; // 备份
for (; p < stu + count; p++) // p++ ,使p指向数组中的下一个元素
{
printf("学号:%d\t, 姓名:%s\t,平均成绩:%5.2f\t\n", p->no, p->name, p->avr);
}
printf("\n");
void displayStudent(struct studentinfo stud[],int count); // 声明
p = stu;
// 指向结构体变量的指针作为函数的参数
displayStudent(stu, count); // 方式一
displayStudent(temp, count);
displayStudent(p, count);
}
/******* 指向结构体变量的指针作为函数的参数 *******/
void displayStudent(struct studentinfo stud[],int count)// 显示学生成绩
{
printf("\n学号\t姓名\t\t平均成绩");
printf("\n");
for(int i=0;i<count;i++)
{
printf("%d",stud[i].no);
printf("\t%s",stud[i].name);
printf("\t%5.2f",stud[i].avr);
printf("\n");
}
printf("\n");
}
/*********** 结构体与输入输出 ********************/
struct studentinfo studentinput()
{
struct studentinfo studn;
int j;
int sum = 0;
printf("\n学号:");
scanf("%d",&studn.no); // 访问结构体变量中的成员
printf("\n姓名:");
scanf("%s",studn.name);
printf("\n三门成绩:");
printf("\n");
for(j=0;j<3;j++)
{
printf("成绩%d: ",j+1);
scanf("%f",&studn.score[j]);
sum = sum + studn.score[j];
}
studn.avr = (float)sum/(float)3;
return studn;
}
void structTest()
{
// input();
void initStruct(); // 声明
initStruct(); // 调用初始化函数
void structPointer();// 声明
structPointer();// 指向结构体的指针
void structArrayPointer(); // 声明
structArrayPointer(); // 指向结构体数组的指针
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -