精华内容
下载资源
问答
  • 五个共同体
    千次阅读
    2018-11-28 15:55:39

    共同体变量的初始化赋值

    定义共同体变量时可以对变量附初始值,但只能对变量的第一个成员赋初值,不可像结构体变量那样对所有的成员赋初值。

    union mydata
    {
    	int i;
    	char j;
    	float k;
    };
    union mydata data = {9};  //将9付给成员i
    union mydata data = {'a'}; //将'a'赋值给成员i,即i的值为'a'的ASCII码
    //初值必须用{}括起来
    

    定义后修改共同体变量的值

    定义了共同体以后,如果要对其赋值,则只能通过成员对其赋值,不可对其整体赋值。

    data.i = 9;
    

    由于共同体变量的各成员共享同一地址的内存单元,共同体保存的是最后一次存入的成员值。

    union mydata data;
    data.i = 9;
    data.j = 'a';	
    //data.j的值才是有效的成员值
    //data.i的值也将变为97
    
    更多相关内容
  • 2021共建地球生命共同体征文 共建地球生命共同体征文范文篇.docx
  • 构建人与自然生命共同体心得体会5篇.pdf
  • 湖南省市十校教研教改共同体2020-2021学年高一下学期期末考试化学试题.docx
  • 人与自然生命共同体优秀心得体会感悟5篇.docx
  • 网络学习共同体作为一种新型的教学方式,有利于帮助学习者在充分的沟通、协作中发展...文章介绍了网络学习共同体的概念、理论渊源、构成侧面,构建了网络学习共同体五要素(准备、组织、规范、执行、监控)的发展过程模式。
  • 湖南省市十校教研教改共同体2020-2021学年高一下学期期末考试数学试题.docx
  • 六数练习五共同体学校集体备课教案.doc
  • 人与自然生命共同体心得篇.pdf
  • 湖南省市十校教研教改共同体2020-2021学年高一下学期期末考试物理试题.docx
  • 机构变量的初始化 结构体数组 例子 通讯录 #include <stdio.h> #define I 3 struct vote { char name[20]; }; void main() { struct vote candidate[I]; int n; int j=0,k=0,m=0; char A...

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    结构体变量的引用

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    机构体变量的初始化

    在这里插入图片描述
    在这里插入图片描述

    结构体数组

    在这里插入图片描述

    例子

    通讯录
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    #include <stdio.h>
    #include <string.h>
    
    #define I 3
    
    struct vote
    {
    	char name[20];
    	int num;
    };
    
    void main()
    
    {
    	struct vote leader[I]={"张三",0,"李四",0,"王小二",0};
    	char leader_name[20];
    	int i,j;
    
    	for(i=1;i<=10;i++)
    	{
    		printf("请输入第%d位投票人员: ",i);
    		scanf("%s",&leader_name);
    		for(j=0;j<I;j++)
    		{
    			if(strcmp(leader_name,leader[j].name)==0)
    			{
    				leader[j].num++;
    			}
    		}
    	}
    	printf("投票结果: \n");
    	for(i=0;i<3;i++)
    	{
    		printf("%s 的票数为 %d\n",leader[i].name,leader[i].num);
    	}
    }
    

    在这里插入图片描述
    `

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    结构指针作为函数参数

    在这里插入图片描述

    结构体变量作为函数参数

    在这里插入图片描述

    指向结构体变量的指针作为实参

    在这里插入图片描述

    动态存储分配

    在这里插入图片描述

    动态存储分配

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    链表

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    
    #define LEN sizeof(struct student) // student结构的大小
    
    struct student *creat();		  //创建链表
    void print(struct student *head); //打印链表
    
    struct student
    {
    	int num;
    	float score;
    	struct student *next;
    };
    
    int n; //全局变量,用来记录存放了多少数据。
    
    void main()
    {
    	struct student *stu;
    
    	stu = creat();
    	print( stu );
    
    	printf("\n\n");
    	system("pause");
    }
    
    struct student *creat()
    {
    	struct student *head;
    	struct student *p1, *p2;
    
    	p1 = p2 = (struct student *)malloc(LEN); //LEN是student结构的大小
    
    	printf("Please enter the num :");
    	scanf("%d",&p1->num);
    	printf("Please enter the score :");
    	scanf("%f",&p1->score);
    
    	head = NULL;
    	n = 0;
    	
    	while( p1->num )
    	{
    		n++;
    		if( 1==n )
    		{
    			head = p1;
    		}
    		else
    		{
    			p2->next = p1;
    		}
    
    		p2 = p1;
    		p1 = (struct student *)malloc(LEN);
    
    		printf("\nPlease enter the num :");
    		scanf("%d",&p1->num);
    		printf("Please enter the score :"); 
    		scanf("%f",&p1->score);
    	}
    
    	p2->next = NULL;
    
    	return head;
    }
    
    void print(struct student *head)
    {
    	struct student *p;
    	printf("\nThere are %d records!\n",n);
    
    	p = head;
    	if( head )   /* 也可以写成 NULL != head */
    	{
    		do
    		{
    			printf("学号为 %d 的成绩是: %f\n",p->num,p->score);
    			p = p->next;
    		}while( p );
    	}
    }
    

    在这里插入图片描述
    在这里插入图片描述

    对链表的删除操作

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    
    #define LEN sizeof(struct student) // student结构的大小
    
    struct student *creat();		  //创建链表
    struct student *del( struct student *head,int num); // del函数用于删除节点, *head即链表
    													// 的头指针, num是要删除的节点num。
    void print(struct student *head); //打印链表
    
    struct student
    {
    	int num;
    	float score;
    	struct student *next;
    };
    
    int n; //全局变量,用来记录存放了多少数据。
    
    void main()
    {
    	struct student *stu;
    
    	stu = creat();
    	print( stu );
    
    	printf("\n\n");
    	system("pause");
    }
    
    struct student *creat()
    {
    	struct student *head;
    	struct student *p1, *p2;
    
    	p1 = p2 = (struct student *)malloc(LEN); //LEN是student结构的大小
    
    	printf("Please enter the num :");
    	scanf("%d",&p1->num);
    	printf("Please enter the score :");
    	scanf("%f",&p1->score);
    
    	head = NULL;
    	n = 0;
    	
    	while( p1->num )
    	{
    		n++;
    		if( 1==n )
    		{
    			head = p1;
    		}
    		else
    		{
    			p2->next = p1;
    		}
    
    		p2 = p1;
    		p1 = (struct student *)malloc(LEN);
    
    		printf("\nPlease enter the num :");
    		scanf("%d",&p1->num);
    		printf("Please enter the score :"); 
    		scanf("%f",&p1->score);
    	}
    
    	p2->next = NULL;
    
    	return head;
    }
    
    void print(struct student *head)
    {
    	struct student *p;
    	printf("\nThere are %d records!\n",n);
    
    	p = head;
    	if( head )
    	{
    		do
    		{
    			printf("学号为 %d 的成绩是: %f\n",p->num,p->score);
    			p = p->next;
    		}while( p );
    	}
    }
    
    
    struct student *del( struct student *head,int num)
    {
    	struct student *p1,*p2;
    
    	if( NULL == head )
    	{
    		printf("\nThis list is null!\n");
    		goto end;
    	}
    
    	p1 = head;
    	while(p1->num != num && p1->next != NULL)
    	{
    		p2 = p1;
    		p1 = p1->next;
    	}
    	if( num == p1->num )
    	{
    		if( p1 == head ) // 当将要删除的结点位于头结点的时候
    		{
    			head = p1->next;
    		}
    		else // 一般情况
    		{
    			p2->next = p1->next;
    		}
    
    		printf("\nDelete No: %d successd!\n",num);
    		n = n-1;
    	}
    	else
    	{
    		printf("%d not been found!\n",num);
    	}
    end :
    	return head;
    }
    

    对链表进行插入操作

    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    
    #define LEN sizeof(struct student)
    
    struct student
    {
    	long num;
    	float score;
    	struct student *next;
    };
    
    int n;
    
    struct student * creat(void)
    {
    	struct student *head;
    	struct student *p1,*p2;
    	head = NULL;
    	n=0;
    	p1 = p2 = (struct student *)malloc(LEN);
    	scanf("%ld,%f",&p1->num,&p1->score);
    	
    	while(p1->num != 0)
    	{
    		n=n+1;
    		if(n==1)
    		{
    			head = p1;
    		}
    		else
    		{
    			p2->next = p1;
    		}
    		p2 = p1;
    		p1 = (struct student *)malloc(LEN);
    		scanf("%ld,%f",&p1->num,&p1->score);
    	}
    	p2->next = NULL;
    
    	return head;
    }
    
    
    
    struct student * create(struct student *head,int num)
    {
    
    	struct student *p1,*p2,*p3,*hcr;
    	p1=p2=head;
    	int s=0;
    	hcr = NULL;
    	while(p1 != NULL)
    	{
    		s = s+1;
    		if(s==1)
    		{			
    			hcr = p1;
    		}
    		else
    			if(s!=num)
    			{
    				p2->next = p1;			
    			}
    			else
    			{
    				printf("请输入你要插入的数据: ");
    				p3 = (struct student *)malloc(LEN);
    				scanf("%ld,%f",&p3->num,&p3->score);
    				p3->next = p1;
    				p2 ->next = p3;
    				
    			}
    		if(s!=num)
    		{
    			p2 = p1;
    						
    		}	
    		else 
    		{
    			p3 = p1;
    			p2 = p3;
    		}
    		
    		p1 = p1->next;
    		
    	}
    	p2->next = NULL;
    
    	return hcr;
    }
    					
    
    void main()
    
    {
    	struct student *pt,*pcr,*t;
    	pt=creat();
    	t=pt;
    
    	do
    	{
    		printf("%ld,%f\n",pt->num,pt->score);
    		pt = pt->next;
    	}while(pt != NULL);
    	printf("\n");
    
    
    
    	printf("请输入你要插入的链位置: ");
    	int num;
    	scanf("%d",&num);
    
    
    	pcr = create(t,num);
    	do
    	{
    		printf("%ld,%f\n",pcr->num,pcr->score);
    		pcr = pcr->next;
    	}while(pcr != NULL);
    
    }
    
    

    在这里插入图片描述

    typedef

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    typedef指向函数的指针

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    共用体

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    #include <stdio.h>
    #include <string.h>
    
    struct 
    {
    	int num;
    	char name[10];
    	char sex[10];
    	char job;
    	union
    	{
    		int banji;
    		char position[10];
    	}category;
    }person[2];
    
    void main()
    {
    	int i;
    	for(i=0;i<2;i++)
    	{
    		printf("please input num: ");
    		scanf("%d",&person[i].num);
    	
    		printf("please input name: ");
    		scanf("%s",&person[i].name);
    	
    		printf("you sex is M|G: ");
    		scanf("%s",&person[i].sex);
    	
    
    		printf("you job is s|t: ");
    		scanf("%s",&person[i].job);
    
    		
    		if(person[i].job=='s')
    		{
    			printf("please input baiji num: ");
    			scanf("%d",&person[i].category.banji);
    		}
    		else
    		{
    			printf("please input position: ");
    			scanf("%s",&person[i].category.position);
    		}
    		printf("\n\n");
    	}
    	for(i=0;i<2;i++)
    	{
    		printf("\tnum\tname\tsex\tjob\tbanji/position\n");
    		if(person[i].job=='s')
    		{
    			printf("\t%d\t%s\t%s\t%c\t%d\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.banji);
    		}
    		else
    		{
    			printf("\t%d\t%s\t%s\t%c\t%s\n",person[i].num,person[i].name,person[i].sex,person[i].job,person[i].category.position);
    		}
    	}
    }
    

    在这里插入图片描述

    枚举类型

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    #include <stdio.h>
    
    void main()
    {
    	enum boy{Tom,Danny,Gan,LiLei};
    	enum boy month[31],j;
    	int i;
    
    	j = Tom;
    
    	for(i=1;i<=30;i++)
    	{
    		month[i] = j;
    		j=boy(j+1);
    
    		if(j > LiLei)
    		{
    			j = Tom;
    		}
    	}
    
    	for(i=1;i<=30;i++)
    	{
    		switch(month[i])
    		{
    		case Tom: printf(" %4d  %s\t",i,"Tom");
    			break;
    		case Danny: printf(" %4d  %s\t",i,"Danny");
    			break;
    		case Gan: printf(" %4d  %s\t",i,"Gan");
    			break;
    		case LiLei: printf(" %4d  %s\t",i,"LiLei");
    			break;
    		default:
    			break;
    		}
    		if(i%5==0)
    		{
    			printf("\n");
    		}	
    	}
    	printf("\n");
    	
    }
    

    在这里插入图片描述

    展开全文
  • 医生民族共同体意识心得体会5篇例文.docx
  • 2020年高考语文作文考前特训话题:命运共同体.doc
  • 届湖南省市十校教研教改共同体高三5月大联考生物试题及答案.docx
  • 2021共建地球生命共同体主题征文800字5篇.pdf
  • 学习共同体的讲座体会修订稿-5页.pdf
  • 2021年人与自然是生命共同体心得5篇.pdf
  • 安徽省安庆共同体高一语文上学期期中试题(无答案) 试题.doc
  • 安徽省安庆共同体高一英语上学期期中试题(无答案) 试题.doc
  • 安徽省安庆共同体高一数学上学期期中试题(无答案) 试题.doc
  • 人与自然生命共同体心得体会学习启示5篇.docx
  • 人与自然生命共同体2021心得体会启发5篇.docx
  • 2021以“共建地球生命共同体”为主题征文5篇.pdf
  • C语言之union共同体

    2021-05-19 10:01:16
    共同体个变量相互影响及原因;union的使用样例;新名词记录{union共同体;Unicode;}概述在C语言中,给我们提供了分配和操作一块内存的方式,那就是union关键字。union关键字,定义union下面的成员变量共享一块内存...

    C语言之union共同体

    文章链接

    知识点

    union共同体的定义;

    union空间长度的分配;

    共同体个变量相互影响及原因;

    union的使用样例;

    新名词记录{union共同体;Unicode;}

    概述

    在C语言中,给我们提供了分配和操作一块内存的方式,那就是union关键字。union关键字,定义union下面的成员变量共享一块内存,每一个成员在任一时刻有且只有一个成员使用此块内存。

    因为C语言只管分配一段空间,至于里面放什么内容,系统都不会管。结构体strcut也是如此。

    定义

    下面直接看如何定义union共同体。共同体是会按照成员中最大的一个数据长度分配空间。

    union data{

    int i;

    double d;

    char str[20];

    };

    解释:在上面的共同体中,定义了3个成员,i占用4个字节,d占用8个字节,而str则占用20个字节,所以data的空间长度是20个字节。

    data共同体名字可以不写,而在最后面也可以加入union的名字,创建union的同时,创建union变量,这个写法和strcut是一样的。eg

    union data{

    int i;

    double d;

    char str[20];

    }d1, d2;

    d1.i = 11;

    d2.i = 12;

    因为有20个字节的空间,里面放入什么内容,取决于我们。例如下面的例子

    union u uu;

    uu.i = 10;

    printf("%d\n",uu.i); //输出10

    //下面根据每个字节放入字符

    char * c;

    c = (char *)&uu;//把union的首地址赋值、强转成char类型

    c[0] = 'a';

    c[1] = 'b';

    c[2] = 'c';

    c[3] = '\0';

    c[4] = 'd';

    c[5] = 'e';

    //最多能到c[19]

    printf("%s\n", c);//利用结束符'\0'打印字符串"abc"

    printf("%c %c %c %c %c %c\n",c[0],c[1],c[2],c[3],c[4],c[5]);

    //分别输出a, b, c, , d, e ,\0输出为空格

    可以在上面看到,我们其实分别在第一个,第二个…等字节中存入了小写字符的值,然后输出每个字节,那么对应的就是每个代表的字符了。

    union空间大小分配

    那么union的分配是按照怎样的规则来分配的呢?

    我们看下面的例子。

    /** * union分配空间大小说明 */

    void unionSizeTest()

    {

    union sizeTest{

    int a;

    double b;

    };

    union sizeTest unionA;

    union sizeTest unionB;

    union sizeTest unionC;

    printf("the initial address of unionA is %p\n",&unionA);

    printf("the initial address of unionB is %p\n",&unionB);

    printf("the initial address of unionC is %p\n",&unionC);

    //证明union分配的空间其实是连续分配的

    /** * the initial address of unionA is 0x7fff53801b08 140734594292488 the initial address of unionB is 0x7fff53801b00 140734594292480 the initial address of unionC is 0x7fff53801af8 140734594292472 */

    }

    从打印的结果可以看出,a和b的地址差了0x08,而b和c之间也是差了0x8,可以看到相邻的两个union变量的空间长度都间隔8个字节。而这个字节则是double变量b的存储大小。因此,这里可以知道,union分配空间是,是按着最大的变量来进行分配的。

    赋值错乱问题

    如果定义了几个变量,但是在没有使用之前,就重新赋值,那么前后的值就会有覆盖。具体问题如下所示。

    void unitTest(){

    union Data{

    int i;

    float f;

    char str[20];

    };

    union Data data;

    data.i = 10;

    printf("data.i=%d\n", data.i);

    data.f = 225.6;

    printf("data.f=%f\n",data.f);

    strcpy(data.str, "tanksu");

    printf("data.str=%s\n", data.str);

    //如果直接全部赋值,那么里面的值就有损坏

    //如下代码

    /**

    * data.i = 10;

    data.f = 220.5;

    strcpy( data.str, "C Programming");

    *

    * 输出:

    * data.i : 1917853763

    data.f : 4122360580327794860452759994368.000000

    data.str : C Programming

    */

    }

    上面的结果可以看出来:共用体成员之间会相互影响,修改一个成员的值会影响其他成员。

    那么这是如何来影响的呢?

    这个共同体需要的空间长度为20个字节,那么我们填充i,只需要填充前面4个字节,而填充f,则需要前面8个字节,但是如果我填充str,则取药填充20个字节。一句话来说,填充f,会影响i;填充str,则会影响i和f。

    那么就可以知道,在我们填充了C Programming字串之后,i只需要前4位的字节,f需要前8位的字节。那么取出来对应的Unicode码对应的字符应该就不是前面赋值给i和f对应的字符了。那么导致的原因也就出来了。

    共同体应用

    一个实例是: 现有一张关于学生信息和教师信息的表格。学生信息包括姓名、编号、性别、职业、分数,教师的信息包括姓名、编号、性别、职业、教学科目。

    f 和 m 分别表示女性和男性,s 表示学生,t 表示教师。

    如果把每个人的信息都看作一个结构体变量的话,那么教师和学生的前 4 个成员变量是一样的,第 5 个成员变量可能是 score 或者 course。当第 4 个成员变量的值是 s 的时候,第 5 个成员变量就是 score;当第 4 个成员变量的值是 t 的时候,第 5 个成员变量就是 course。

    #include

    #include

    #define TOTAL 4 //人员总数

    struct{

    char name[20];

    int num;

    char sex;

    char profession;

    union{

    float score;

    char course[20];

    } sc;

    } bodys[TOTAL];

    int main(){

    int i;

    //输入人员信息

    for(i=0; i

    printf("Input info: ");

    scanf("%s %d %c %c", bodys[i].name, &(bodys[i].num), &(bodys[i].sex), &(bodys[i].profession));

    if(bodys[i].profession == 's'){ //如果是学生

    scanf("%f", &bodys[i].sc.score);

    }else{ //如果是老师

    scanf("%s", bodys[i].sc.course);

    }

    fflush(stdin);

    }

    //输出人员信息

    printf("\nName\t\tNum\tSex\tProfession\tScore / Course\n");

    for(i=0; i

    if(bodys[i].profession == 's'){ //如果是学生

    printf("%s\t%d\t%c\t%c\t\t%f\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.score);

    }else{ //如果是老师

    printf("%s\t%d\t%c\t%c\t\t%s\n", bodys[i].name, bodys[i].num, bodys[i].sex, bodys[i].profession, bodys[i].sc.course);

    }

    }

    return 0;

    }

    /* 运行结果: Input info: HanXiaoXiao 501 f s 89.5↙ Input info: YanWeiMin 1011 m t math↙ Input info: LiuZhenTao 109 f t English↙ Input info: ZhaoFeiYan 982 m s 95.0↙ Name Num Sex Profession Score / Course HanXiaoXiao 501 f s 89.500000 YanWeiMin 1011 m t math LiuZhenTao 109 f t English ZhaoFeiYan 982 m s 95.000000 */

    总结

    上面讲到了union共同体的定义,如何分配空间,以及变量之间赋值错乱的导致原因。其实最主要的还是要理解union的空间分配以及基本数据类型占用的存储字节数。最后引用了一个union使用的例子,方便理解。

    以上就是所有内容,如有任何问题,请及时与我联系。谢谢

    展开全文
  • 京源学校十年一贯制,打造学生成长的共同体.docx
  • 2021共建地球生命共同体主题征文800字最新5篇.docx
  • 浙江省丽水市共同体2020-2021学年高一10月月考政治试题
  • 安徽省安庆共同体2020学年高一语文上学期期中试题(无答案).doc
  • 安徽省安庆共同体2020学年高一英语上学期期中试题(无答案).doc

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 168,277
精华内容 67,310
热门标签
关键字:

五个共同体