------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1.结构体
(1)什么是结构体,结构体的用途
当一个整体由多个数据构成时,我们可以用数组来表示这个整体,但是数组有个特点:内部的每一个元素都必须是相同类型的数据。C语言专门提供了一种构造类型来解决上述问题,这就是结构体,它允许内部的元素是不同类型的。
iOS用到的结构体: 描述一个点的位置, 描述矩形的大小, 描述一个矩形区域
为了描述比较复杂的对象(点, 大小, 人),
使用自定义结构体类型描述这些对象
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)如何定义一个结构体类型?
定义一个描述人的结构体类型
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);
#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种可能的取值:春天、夏天、秋天、冬天。
实例: 显示一个窗口, 设置显示的色彩
定义关于颜色的枚举
enum关键字, 定义枚举类型
Color是枚举名
枚举中需要添加一些枚举值
细节1: 枚举值一般需要大写, 也可以不大写
细节2:每个枚举值之间使用逗号分隔
enum Color{
RED,BLUE,GREEN=100,WHITE,BLACK,YELLOW
};
如何使用
每个枚举值相当于一个宏定义
每个枚举值都对应一个整数
默认情况下, 第一个枚举值对应数字是0,以后依次类推
实例: 显示一个窗口, 设置显示的色彩
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)如何使用枚举的值?
作用: 为某各种类型取一个别名
char *类型取一个别名 pchar
语法: typedef char * pchar;
(2)typedef在跨平台中的作用
C语言并没有规定每种类型应该占据几个字节
每种的类型的大小是由平台,操作系统, 编译器决定的
(3)typedef用于结构体定义
(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;
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>函数调用在程序运行时执行,而宏替换只在编译预处理阶段进行。所以带参数的宏比函数具有更高的执行效率