A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 普通蜗牛 中级黑马   /  2015-8-2 17:01  /  600 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//
//  0731结构体指针总结.h

//----------------结构体指针
结构体指针 间接访问成员值

其访问的一般形式为:(*结构指针变量).成员名

1、结构体变量的才成员值
struct Student{
    int age;
    char *name;

};
struct Student stu1={18,"zhangsanfeng"};

结构体变量的成员值有2个
//stu1.age 值 18
//stu1.name 值 zhangsanfeng

2、用结构体指针间接的访问结构体变量的成员
struct Student *p=&stu1;

//使用p获取 18 zhangsanfeng

有两种方法
1)(*p).age 访问年龄
   (*p).name 访问姓名
2)p->age  访问的年龄
  p->name 访问的姓名


**************************************************
结构体的嵌套使用

之前学过的嵌套
1)if(){
     if(){
         
         }
  }

2) ( ? :)? :

3) for(){

     for(){
   
     }
}

4)递归函数勉强算嵌套

5)max(max(),45);

结构体的嵌套 :
        结构体定义中,结构体的成员又是另外一个结构体类型

结构体嵌套的注意事项:
    1)结构体定义中可以嵌套其他结构体类型的变量
       但不可以嵌套自己这个类型的变量
//定义一个Date的结构体
struct Date{
    int year;
    int month;
    int day;
};
//定义了一个Student的结构体
struct Student{
    char *name;
    int age;
    float score;
    //Struct Student stu; //这个是错误的 ,不可以嵌套自己这个类型的变量
    struct Student *stu;//这个是正确的
    struct Date birthday;//这是一个嵌套
}

1.嵌套的结构体如何初始化
struct Student stu1={"张三丰",28,59.99f,{1200,12,12}};

若要单独给 stu1.birthday赋值,
stu1.birthday=(struct Date){1200,12,12};//必须加一个强制转换

2.嵌套的结构体如何进行访问

printf("姓名:%s,年龄:%d (生日:%d-%02d-%02d),成绩:%.2f\n",stu1.name,stu1.age,stu1.birthday.year,stu1.birthday.month,stu1.birthday.day,stu1.score);


3.结构体嵌套自身的指针
struct Person{
    char *name;
    int age;
    //嵌套自己类型的指针
    struct Person *child;
};
//结构体嵌套自身指针的初始化

struct Person kim={"kim",8,NULL};
//struct Person *child =&kim;
sturct Person p1={"林志颖",38,&kim};

//结构体嵌套自身指针的访问
printf("%s的儿子是:%s,小孩年龄是%d\n",p1.name,(*p1.child).name,(*p1.child).age)

printf("%s的儿子是:%s,小孩年龄是%d\n",p1.name,p1.child->name,p1.child->age);



**********************************************************
结构体变量及成员作为函数的参数
//定义结构体
struct Car{
    int lunzi;
    int speed;
   
};
//1、用结构体变量的成员值作为函数的参数,实质是值传递

void xiuche(int n){
    n=2;
}
//2、结构体变量作为函数的参数 实质上还是值传递

void xiuche1(struct Car c1){
    c1.lunzi=2;
}
//注意:用结构体变量的地址传递给函数
//     也可以理解为用结构体指针作为函数的参数  是地址传递
void xiuche2(struct Car *c1){
    c1->lunzi=2;
}

    struct Car car1={4,200};

    xiuche(car1.lunzi);
    //1、用结构体变量的成员值作为函数的参数,实质是值传递
    printf("%d\n",car1.lunzi);

    //2、结构体变量作为函数的参数 实质上还是值传递
    xiuche1(car1);
    printf("%d\n",car1.lunzi);

    //注意:用结构体变量的地址传递给函数
    //     也可以理解为用结构体指针作为函数的参数  是地址传递
    xiuche2(&car1);
    printf("%d\n",car1.lunzi);

**********************************************************


枚举类型
  C语言提供了一个种类型,这种类型的变量的取值被限定在一定的范围之内
枚举类型的定义:
enum 枚举类型名{
      枚举值1,枚举值2,...
  };

枚举不可以嵌套定义


**********************************************************
枚举类型的变量

//1、枚举类型变量的定义
enmu iColor{kIcolorWhite,kIcolorBlack,kIcolorTHJ};
1)先定义枚举类型,再定义枚举变量
        enum 枚举类型名 枚举变量名列表;
        enum iColor iPhoneColor;
2)定义枚举类型的同时,定义变量
enum Sex{kSexMan,kSexWomen,kSexYao} isex;

//2、枚举类型变量的初始化
//给枚举变量赋值
iPhoneColor=kIcolorBlack;

//3、枚举变量值如何使用

printf("%d\n",iPhoneColor);

//4、枚举变量的值
枚举类型定义完成以后,系统会自动给枚举的每个元素赋值一个整型的初值
  默认初值:从第一个元素开始值为0,以后每个元素的值,是上一个元素的值加1


**********************************************************
typedef 关键字介绍
                  typedef就是给别人给外号的
定义:
typedef 原类型名 新类型名

typedef 给五种数据类型起别名
//-----------1.给基本数据类型
typedef int MALATANG;

//-----------2.用在数组,给数组起别名
typedef int ARRAY[5];//定义数组长度为5的数组类型
ARRAY a1,b1;//等同于 int a1[5],b1[5];

//-----------3.给结构体起别名
struct Person{
    char *name;
    int age;
};
struct Person p1={"zbz",18};

//给struct Person 起个别名 P

typedef struct Person P;
//用别名定义新的变量
P p2={"sdf",28};

typedef struct Car{
    int lunzi;
    int speed;
}MYCAR;//表示把结构体起个别名 MYCAR

MYCAR car1={1,200};
//给匿名结构体起个别名
typedef struct {
    int screenSize;
    int ram;

}IPHONE;





//---------------4.给枚举类型起别名

typedef enum Sex{
    kSexMan,
    kSexWomen,
    kSexYao
}ISEX;//ISEX是别名

//给匿名枚举类型取别名
typedef enum{
    zhouyi,
    zhouer,
    zhousan
}WEEKDAY;//WEEKDAY是别名

//----------------5.给函数指针起别名

函数指针:指向函数的指针,
定义:int(*p)(int,int);//函数指针

//给函数指针起别名
typedef  int(*FUN)(int,int);//FUN是一个别名

FUN f1,f2;//f1 f2都是函数指针。


**********************************************************
预处理指令的概念及分类

以“#”开头的都叫做预处理指令



//----------------宏的概念及无参宏定义方法

宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C语言中,
“宏”分为有参数和无参数两种。本节讨论无参数宏。

1.宏 概念: C 语言中我们自定义的特殊标示符,习惯大写

2.宏 定义:
无参宏的宏名后不带参数。其定义的一般形式为:
#define 标识符 字符串
注意: 预处理指令,经常写在函数之前。
3.宏替换
    源程序在编译之前,由预处理程序对我们写的源代码进行处理,会把源代码中所有出现 宏名的地方一律使用 宏的字符串 去替换


4.宏使用的注意事项
1)宏是有作用域的 可以使用#undef 取消宏定义

    2)在字符串中出现的宏名不会被替换

    3)宏定义运行嵌套
#define R 4
#define PI 3.14
#define AREA PI*R*R

    4)使用 宏起别名
#define INT1 int

INT1 a;
a=10;


//-------------------有参宏的定义和使用

定义方法

无参宏 #define M 10

有参宏
      #define SUM(a) a+a
      #define M1(x,y) x*y+x+y

int result =SUM(3);
printf("result=%d\n",result);//结果为 6

int result =M1(4,5);
printf("result=%d\n",result);//29


//---------------有参宏的使用注意事项

1.宏的形参与形参之间可以出现空格,但是宏名和形参之间不能出现空格

2.有参宏 宏的参数最好括起来
#define M1(x ,y) x*y+x+y
int a = 3;

result = M1(a+3, a-1);
//(x  ,y) x*y+x+y
//       6*2 +6+2
// 20 错误的

//  a+3*a-1+a+3+a-1
//  a+9  -1+a+3+a-1
//  3+9-1+3+3+3-1
//  19 这个才是正确的


#define M1(x  ,y) (x)*(y)+(x)+(y)




3.可以用宏来定义多个语句
#define M3(m,n) m = a+2;n=a*2;

int a = 3;

int i,j;
printf("%d\n",result);
printf("i=%d,j=%d\n",i,j);//0 0

M3(i, j);
printf("i=%d,j=%d\n",i,j);// 5 6

//-----------------使用有参宏求最大值

//定义一个有参宏,求两个数的最大值
#define MAX(a,b) a>b?a:b

    //调用有参宏
    int m = MAX(34, 2);
    printf("%d\n",m);






0 个回复

您需要登录后才可以回帖 登录 | 加入黑马