⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 复件 pointer_struct.cpp

📁 其他人不需帐号就可自由下载此个C或Java源
💻 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 + -