黑马程序员——C语言---结构体、枚举、预处理指令

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1.结构体

(1)什么是结构体,结构体的用途
 当一个整体由多个数据构成时,我们可以用数组来表示这个整体,但是数组有个特点:内部的每一个元素都必须是相同类型的数据。C语言专门提供了一种构造类型来解决上述问题,这就是结构体,它允许内部的元素是不同类型的。
 iOS用到的结构体: 描述一个点的位置, 描述矩形的大小, 描述一个矩形区域

               点(x,y)
                大小(width, height)
                矩形区域(左上角的点, 矩形大小)

                描述一个人
                char name[] = "zhangsan";
                char gender = 'B';
                int age='27';

                char name1[] = "lisi";
                char gender1 = 'B';
                int age2='27';

 为了描述比较复杂的对象(点, 大小, 人),
 使用自定义结构体类型描述这些对象
核心: 系统提供的类型不能满足我们的需求, 需要自定义类型
(2)如何定义一个结构体类型?
定义一个描述人的结构体类型
struct用于定义结构体类型的关键字
  Person结构体名字, 编程习惯上结构体首字母大写
 细节: 别忘了结构体最后的分号";"
struct Person
{
    //这两个变量称为结构体中的属性
    char gender;
    int age;
};

 (3)如何定义一个结构体变量?

        struct Person是变量的类型
        zhangsan结构体变量名
        struct Person zhangsan;

 (4)如何使用这个结构体变量?

       数据存储到结构体变量的属性中
        zhangsan.age = 33;
        zhangsan.gender = 'B';
        
        printf("age = %d,gender=%c\n",
        zhangsan.age,zhangsan.gender);

 2. 宏定义

如何定义一个宏

一般形式

#define宏名 字符串

比如#define ABC 10

右边的字符串也可以省略,比如#define ABC

使用宏的好处
    (1)一改多改的效果
    (2)把数字取代为宏之后, 提高代码的可读性
      宏的本质   代码的出现的宏替换为对应的文本(文本替换)
    (3)如何使用这个宏
       #define PI 3.1415926
        double area = r*r*PI;
        double len = 2*PI*r;
        printf("area=%f len=%f\n",area,len);

3. 枚举

 (1)什么是枚举, 枚举在项目中的用途
枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数。当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型。比如,你可以用一个枚举类型的变量来表示季节,因为季节只有4种可能的取值:春天、夏天、秋天、冬天。
 实例:  显示一个窗口, 设置显示的色彩
 void showWindow(int color)
  {
     switch(color)
           {
              case 0: printf("红色");
              case 1: printf("蓝色");
              case 2: printf("绿色");
           }
     }
    
  showWindow(1);
 (2)如何定义枚举?

 定义关于颜色的枚举
  enum关键字, 定义枚举类型
 Color是枚举名
 枚举中需要添加一些枚举值
 细节1: 枚举值一般需要大写, 也可以不大写
 细节2:每个枚举值之间使用逗号分隔
enum Color{
    RED,BLUE,GREEN=100,WHITE,BLACK,YELLOW
};

如何使用
每个枚举值相当于一个宏定义
每个枚举值都对应一个整数
 默认情况下, 第一个枚举值对应数字是0,以后依次类推
      枚举对应的数值可以自由指定, 指定了之后, 如果下一个枚举值没有指定一个数字, 它的值前一个枚举值+1

 (3)如何使用枚举的值?

void showWindow(int color)
{
    switch (color) {
        case RED:printf("红色\n");break;
        case BLUE:printf("蓝色\n");break;
        case GREEN:printf("绿色\n");break;
        default:
            break;
    }
}

        showWindow(RED);
        
        showWindow(0);

4. typedef类型别名

 (1)typedef关键字的作用

 作用: 为某各种类型取一个别名

 char *类型取一个别名    pchar

 语法:   typedef     char *     pchar;

 (2)typedef在跨平台中的作用

  C语言并没有规定每种类型应该占据几个字节

  每种的类型的大小是由平台,操作系统, 编译器决定的
    发送数据包
      struct NET_PACK_HEAD
           {
                    int mTag;
                    long mFun;
            }
    typedef long NSInteger;
    typedef unsigned long NSUInteger;

(3)typedef用于结构体定义
      
 struct Person
        {
            int age;
            char gender;
        };
        //为struct Person取一个别名Person
        //效果: 可以直接使用Perosn定义结构体变量
        typedef struct Person Person;
        
        struct Person zhangsan;
        Person lisi;

    5. 预处理-注释

        (1)头文件包含
        //使用一个函数或者(类)的时候需要包含它的头文件
        #import <Foundation/Foundation.h>
        #include <stdio.h>
        #import和#include的作用都是包含一个头文件, #import能自动防止头文件被重复包含
        (2) #ifdef------用于调试的例子
        //预处理语句-根据某个宏是否定义
        //  决定是否编译代码
        //#define MYDEBUG
        //如果指定的宏被定义了, 则编译代码
        #ifdef MYDEBUG
        NSLog(@"ni shi ren jian 4 yue tian");
        #endif

  6. 动态内存分配和内存结构

  (1)malloc和free函数的使用
  void *malloc(long NumBytes) :该函数分配了NumBytes 个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL )。

   关于分配失败的原因,应该有多种,比如说空间不足就是一种。

   void free(void *FirstByte) 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。

(3)内存的分布结构
       
//测试: 数组2M的大小
        //2M = 2 * 1024*1024B
        //int num[2*1024*1024-1024];
        
        //申请100M的空间
        //  100*1024*1024Byte
        
        //通过malloc函数申请了100*1024*1024字节空间
        //   void*  malloc(size_t);
        //  返回值是void*, 意味着可以使用任意类型接收
        char *p = malloc(100*1024*1024);
        
        *(p+0) = 'A';
        //*(p+1) = 'B';
        p[1] = 'B';
        p[2] = 'C';
        p[3] = 0;
        puts(p)
 
 核心和重点问题
         malloc申请的内存系统不会自动释放
          需要我们使用free手工释放
           free(p);  

 程序中专门存储数据区域: 数据区

  细分为三个区域

   (1)栈
      存放: 函数中局部变量, 函数参数
      特性: 系统自动分配, 系统自动回收 
   (2)堆
      存放: malloc申请的内存
      特性: malloc手工申请, free手工释放
   (3)静态存储区
   存放: 全局变量, static静态变量
            字符串常量(只读)

   特性: 程序开始的时候申请空间,结束时释放  .

宏与函数的区别

从整个使用过程可以发现,带参数的宏定义,在源程序中出现的形式与函数很像。但是两者是有本质区别的:

1>宏定义不涉及存储空间的分配、参数类型匹配、参数传递、返回值问题

2>函数调用在程序运行时执行,而宏替换只在编译预处理阶段进行。所以带参数的宏比函数具有更高的执行效率


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值