概述
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.结构体的概念
有时需要将不同类型的数据组合成一个有机的整体,以便于引用。这时就要用到结构体。
2.结构体的定义与引用
struct 结构体名
{成员表列};
注意分号不能省略。
(1)先声明结构体类型再定义变量名
struct s s1,s2;(2)在声明类型的同时定义变量
这种形式的定义的一般形式为:
struct 结构体名
{
成员表列
}变量名表列;
struct student
{ intnum;
charname[20];
}student1,student2;
(3)直接定义结构体类型变量
其一般形式为:
struct
{
成员表列
}变量名表列;
即不出现结构体名。
引用结构体变量中成员的方式为
结构体变量名.成员名
如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。
对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。
可以引用结构体变量成员的地址,也可以引用结构体变量的地址。
结构体变量的地址主要用作函数参数,传递结构体变量的地址。
对结构体变量的初始化:
#include "stdio.h"
void main(){
struct stu {
int age;
char *name;
}s1 = {10,"asd"};
printf("%d,%sn",s1.age,s1.name );
}
3.结构体数组
所谓结构体数组,就是说数组里的元素都是结构体类型的。
struct stu{
int age;
char *name;
};
struct stu[2];也可以直接定义。
结构体数组的初始化和二维数组的类似
struct stu[2] = {{1,"asd"}{2,"qwe"}};
也可以先声明结构体类型,然后定义数组为该结构体类型,在定义数组时初始化。
4.指向结构体类型的指针
一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。
指针变量也可以用来指向结构体数组中的元素。
struct stu a; struct stu *p; p = &a
结构体变量.成员名
(*p).成员名
以上三种形式是等价的。
注意区分以下三种形式:
在结构体数组中,如果指针p的初值是a
(++p)->age 先使p自加上1,指向的是数组下一元素,然后取出age值
(p++)->age 先取出数组中结构体元素age值,然后p自加上1,指向的是数组的下一个元素。
程序已定义了p是一个指向struct student类型数据的指针变量,
它用来指向一个struct student类型的数据,不应用来指向stu数组元素中的某一成员。
将一个结构体变量的值传递给另一个函数,有3个方法:
(2)用结构体变量作实参。
(3) 用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参#include "stdio.h"
struct stu {
int age;
char *name;
};
void print(struct stu a){
printf("%d, %sn",a.age,a.name);
}
void main(){
struct stu s = {10,"asd"};
print(s);
}
改为指针参数后:
#include "stdio.h"
struct stu {
int age;
char *name;
};
void print(struct stu *a){
printf("%d, %sn",a->age,a->name);
}
void main(){
struct stu s = {10,"asd"};
struct stu *p = &s;
print(p);
}
5.用结构体创建链表
链表是一种常见的重要的数据结构,是动态进行存储分配的一种结构。
链表由头指针和节点组成。
头指针:存放一个地址,该地址指向下一个元素;
节点:用户需要的数据和连接节点的指针。
用结构体创建链表:
struct stu {
int age;
struct stu *next;
};
C语言提供了处理动态链表所需要的函数:
其函数原型为void*malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。
此函数的值(即“返回值”)是一个指向分配域起始地址的指针(类型为void)。
如果此函数未能成功地执行(例如内存空间不足),则返回空指针(NULL)。
(2) calloc函数
其函数原型为void *calloc(unsigned n,unsigned size);其作用是在内存的动态存储区中分配n个长度为size的连续空间。
函数返回一个指向分配域起始地址的指针;如果分配不成功,返回NULL。
用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size
(3)free函数
其函数原型为void free(void*p);其作用是释放由p指向的内存区,使这部分内存区能被其他变量使用。
p是最近一次调用calloc或malloc函数时返回的值。free函数无返回值.
6.共用体
使几个不同的变量共占同一段内存的结构称为“共用体”类型的结构.
定义共用体类型变量的一般形式为:
union 共用体名
{
成员表列
}变量表列;
union data{int a;
double b;
}a,b;
共用体和结构体的比较:
--结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。
int a;
double b;
}a,b;
void main(){
b.a =10;
printf("%d",b.a );
}
(1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。
(2) 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。
(3) 共用体变量的地址和它的各成员的地址都是同一地址。
枚举:将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。
申明枚举类型用enum
enum weekday{sun,mon,tue,wed,thu,fri,sat};
定义变量:
enum{sun,mon,tue,wed,thu,fri,sat}workday;
变量值只能是sun到sat之一
在C中,不能对枚举类型赋值,因为它们是常量。编译器按顺序为其赋值。0,1,2。。。用typedef声明新的类型名来代替已有的类型名
声明INTEGER为整型
typedef int INTEGER
声明结构类型
Typedef struct{
int month;
}DATE;
声明ARR为整型数组类型
typedef int ARR[100];
声明STRING为字符指针类型
typedef char *STRING;
声明POINTER为指向函数的指针类型,该函数返回整型值
typedef int (*POINTER)()
(2) 用typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。
(3) 当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型,把它们单独放在一个文件中,
然后在需要用到它们的文件中用#include命令把它们包含进来。
(4) 使用typedef有利于程序的通用与移植。注意:虽然#define功能上和typedef有相似之处,但是它们是同的。#define是在预编译的时候进行处理,只是简单的替换。
typedef是在编译的时候进行处理,它不是简单的替换,而是像定义一个类型的变量那样,声明一个类型。
最后
以上就是哭泣皮卡丘为你收集整理的黑马程序员---iOS基础---C语言中的结构体等问题的全部内容,希望文章能够帮你解决黑马程序员---iOS基础---C语言中的结构体等问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复