C语言结构体

一、结构体的定义

1、定义形式

struct 结构名

{成员列表;};       //定义为语句,分号不能丢

2、结构类型变量的声明

(1)声明形式1

struct student

{

int number;

char name[10];

float score;

};

struct student st1,st2,st3;

(2)声明形式2

struct student

{ int number;

char name[10];

float score;

}st1,st2,st3;

(3)结构体变量的赋值

如上例:

struct student

{ int number;

char name[10];

float score;

}st1={101,"wang",87.5};

3、结构数组的定义

struct student

{

int number;

char name[10];

float score;

}stu[50]={

{101,"wang",87.5},

{102,"li",90},

...

};   //定义并初始化50个数组元素,每个元素均具有结构体student的结构。

二、结构指针

1、声明形式

struct 结构名 *指针变量名      //方法一:须在声明结构指针变量前应已说明该结构体

struct 结构名

{

结构体

}*指针变量名;    //方法二:与结构体变量一样

2、结构指针的赋值

struct student{

...

};

struct student *p;

struct student st1={..};

p=&st1;  //取该结构体变量的首地址

3、通过结构指针变量访问结构变量成员

若st1为上述student结构体变量,p为该结构体指针变量:

使p=&st1;则可用下列方法访问st1各成员:

p->num、p->name、p->score。

或(*p).num、(*p).name ...

与st1直接引用:st1.num都可以用来表示st1的成员。

4、指向结构数组的指针

struct student

{

int num;

char name[10];

}stu[10]={...};                //声明并初始化结构数组stu

struct student *p;            //声明结构指针p

p=stu;        //对p赋值,指向数组stu首地址

for(;p<stu+10;p++)           //stu+10表示第10个数组元素的首地址,p++表示指向下一个  数组元素

printf("%d,%s",p->num,p->name[10]);  //通过指针变量引用结构数组元素的成员

三、动态存储分配

1、malloc函数

在内存动态存储区里分配一块长度为N字节的连续区域,返回值为该内存区首地址,类型说明符表示该内存区存贮的数据类型,(类型说明符*)表示将该返回值指针强制转换成该类型指针:

(类型说明符*)malloc(N)

如:

(int*)malloc(100);

(struct student*)malloc(sizeof(struct student));

2、calloc函数

(类型说明符*)calloc(n,N) //动态存储区内分配n个长度为N字节的连续区域,返回值为该区首地址,(类型说明符*)表示将该返回值指针强制转换成该类型指针;

3、free函数

free(void*ptr);  //释放指针变量ptr指向的一块内存空间,使用free函数前:ptr指向的必须是事先通过malloc或calloc分配的区域。

四、链表

如何分配空间来存储学生的数据?可想到使用结构体数组,但如何确定学生的数量?新增或删减学生如何处理?引申出链表描述:

链表各元素首先均是一个结构体,各个元素称为结点,各结点对应结构体内有一成员为指针变量,指向该结点下一个结点的首地址,第0个结点称为头结点,仅存有指针变量,指向第1个结点;最后一个结点的指针变量成员指向为空(NULL)。

例:建立一个学生数据的链表结构

struct student{

char *name;

struct student *pnext;  //指向下一个结点的指针变量,下一结点数据类型为结构体

};        //完成链表结构声明

int i;

struct student *head,*p1,*pass;

for(i=0;i<N;i++)

{

  p1=(struct student*)malloc(sizeof(struct student));//分配一块结点空间

  if(i==0)  {head=p1;pass=p1;}        //头结点初始化

  else  {pass->next=p1;pass=p1;}    //用pass暂存当前地址,作为中间量传递

  printf("input name:\n");

  scanf("%s",p1->name);           //链接结点内容输入

  p1->next=Null;           //每次循环当前分配区为最后一个结点,使其指针指向空

}

return  head;      //返回链表头结点
时间: 2024-12-29 23:31:43

C语言结构体的相关文章

C语言 结构体指针赋值 incompatible types when assigning to type &#39;char[20]&#39; from type &#39;char *&#39;

strcpy(pstudent->name, "guo zhao wei "); 为什么错误,该怎么写,(红色行) 追问 为什么不能直接赋值啊, 追答 用char nnnn[20]定义的,用strcpy 用char *ppp定义的,用=来赋值 C语言 结构体指针赋值 incompatible types when assigning to type 'char[20]' from type 'char *'

漫谈C语言结构体struct、公用体union空间占用

先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; union union_data1{ short a;//本身占用2个字节 char b[13];//本身占用13个字节 int c ;//本身占用4个字节 }; struct struct_data{ int a ;//int本身占用4个字节,偏移量为0 char b ;//char本身占用1个字节,偏移量为

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

C语言结构体(struct)常见使用方法(转)

本文转自 CSDN huqinweI987 基本定义:结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问修改内部变量. 结构体定义: 第一种:只有结构体定义 [cpp] view plaincopy struct stuff{ char job[20]; int age; float height; }; 第二种:附加该结构体类型的“结构体变量”的初始化的结构体定义 [cpp] view plaincopy

C语言结构体赋初值

C语言结构体赋初值,特别是结构体中含有数组成员是,最后一个逗号最好是不要多写.因为有些时候可能会出错.图中,红色的框框处.

读陈浩的《C语言结构体里的成员数组和指针》总结,零长度数组

原文链接:C语言结构体里的成员数组和指针 复制如下: 单看这文章的标题,你可能会觉得好像没什么意思.你先别下这个结论,相信这篇文章会对你理解C语言有帮助.这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接.微博截图如下.我觉得好多人对这段代码的理解还不够深入,所以写下了这篇文章. 为了方便你把代码copy过去编译和调试,我把代码列在下面: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h>

c 语言 结构体

结构体初学者都有点小怕其实思维清晰之后你会发现结构体是个非常好的东西,嘿嘿. 第一,结构体的定义和初始化.别被书上大量的描述吓到 1.怎么定义结构体了例子如下,我们以构建一个包含学生姓名,年龄,Email为例子 1 struct 2 { 3 char name; 4 int age; 5 char Email; 6 }person; 现在我们定义就已经完成了,当然这是我最喜欢的范式,你们也可以在书上找到自己喜欢的. 2.怎么初始化了?结构体一般初始化都是以结构体数组的形式来的所以我们只说这个 t

C语言结构体的初始化

今天在工作时,看到了奇葩的结构体初始化方式,于是我查了一下C99标准文档和gcc的说明文档,终于搞清楚是怎么回事了. 假设有如下结构体定义: typedef struct { int a, b, c; } MyStruct; 那么结构体的初始化方式如下有三种: (1) C89的初始化方式 MyStruct test = {1, 2, 3}; 这种初始化的优点是语法简单,无需输入变量名:缺点是成员变量的初始化顺序必须与声明的一致,无法乱序初始化. (2) C99新增的初始化方式 MyStruct

不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

[源码下载] 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 共用体 枚举 类型定义符 示例cStruct.h #ifndef _MYHEAD_STRUCT_ #define _MYHEAD_STRUCT_ #ifdef __cplusplus extern "C" #endif char *demo_cStruct(); #endif cStruct.c /* * 结构体,共用体,枚举,类型定义符 * * 注:结构体变量在做参数传递时,其内每个

C语言结构体声明中冒号的使用(占位符) &amp; C结构体的乱序初始化

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段".所谓"位域"是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作.这样就可以把几个不同的对象用一个字节的二进制位域来表示.一.位 域的定义和位域变量的说明位域定义与