黑马程序员---iOS基础---C语言中的结构体等问题

来源:互联网 发布:深入分析java web pdf 编辑:程序博客网 时间:2024/05/20 06:54

------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,%s\n",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->n得到p指向的结构体变量中的成员n的值。

p->n++ 得到p指向的结构体变量中的成员n的值,用完该值后使它加1。

++p->n 得到p指向的结构体变量中的成员n的值加1,然后再使用它。

在结构体数组中,如果指针p的初值是a

(++p)->age 先使p自加上1,指向的是数组下一元素,然后取出age值

(p++)->age 先取出数组中结构体元素age值,然后p自加上1,指向的是数组的下一个元素。


程序已定义了p是一个指向struct student类型数据的指针变量,

它用来指向一个struct student类型的数据,不应用来指向stu数组元素中的某一成员。

将一个结构体变量的值传递给另一个函数,有3个方法:

(1)用结构体变量的成员作参数。

(2)用结构体变量作实参。

(3) 用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参

#include "stdio.h"
struct stu {
int age;
char *name;
};
void print(struct stu a){
printf("%d, %s\n",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, %s\n",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;
};

age为用户需要的数据,而struct stu *next就是链接节点的指针。

C语言提供了处理动态链表所需要的函数:

(1)malloc函数

其函数原型为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;

共用体和结构体的比较:

--结构体变量所占内存长度是各成员占的内存长度之和。每个成员分别占有其自己的内存单元。

--共用体变量所占的内存长度等于最长的成员的长度。

共用体变量的引用:
引用前需要定义,而且只能引用共用体变量的成员,不能引用共用体变量。
union data{
int a;
double b;
}a,b;
void main(){
b.a =10;
printf("%d",b.a );
}

(1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种,而不是同时存放几种。

(2) 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。 

(3) 共用体变量的地址和它的各成员的地址都是同一地址。


7.枚举类型

枚举:将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。

申明枚举类型用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。。。

枚举值可以用来作判断比较。一个整型值也是不能赋值给枚举常量的。

 8.typedef

用typedef声明新的类型名来代替已有的类型名

声明INTEGER为整型

typedef int INTEGER

声明结构类型

Typedef struct{

 int month;

}DATE;

声明ARR为整型数组类型

typedef  int ARR[100];

 

声明STRING为字符指针类型

typedef char *STRING;

 

声明POINTER为指向函数的指针类型,该函数返回整型值

typedef int (*POINTER)() 


(1)用typedef可以声明各种类型名,但不能用来定义变量。

(2) 用typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。

(3) 当不同源文件中用到同一类型数据时,常用typedef声明一些数据类型,把它们单独放在一个文件中,

      然后在需要用到它们的文件中用#include命令把它们包含进来。

(4) 使用typedef有利于程序的通用与移植。

注意:虽然#define功能上和typedef有相似之处,但是它们是同的。#define是在预编译的时候进行处理,只是简单的替换。

typedef是在编译的时候进行处理,它不是简单的替换,而是像定义一个类型的变量那样,声明一个类型。







0 0