C语言-Pointer(high)AndMacro
2015-08-10 20:18
471 查看
// main.m
// Point.h/Point.m
// Student.h/Student.m
#import <Foundation/Foundation.h> #import "Student.h" #import "Point.h" //预编译指令 //宏定义 //形式上有两种: //宏不是变量而是常量 //宏只做替换,简单的替换!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //对于带参宏,宏名和"()"之间没有空格 代替的内容需要括号 //宏定义之后不写";"分号 //1.宏名全大写 //2.k + 驼峰 #define SIZE 10 #define kNuZhuXiLanHua 1000 //带参宏 //#define SUM(x,y) x + y //printf("%d\n",SUM(10,5)); 中的 SUM(10,5) 会自动默认为 10 + 5 //#define MUL(a,b) a * b //printf("%d\n",MUL(2 + 3,10 + 4)); 默认为 2 + 3 * 10 + 4,因为计算机只作简单的计算所以一般的命名在每一个字母和每一次运算都需要加括号 //正确定义如下 #define SUM(x,y) ((x) + (y)) #define MUL(a,b) ((a) * (b)) #define kMaxValue(x,y) ((x) > (y) ? (x) :(y)) //条件编译 #ifdef TEST //如果 #define过 TEST,执行第一段代码,否则执行第二段 int aa = 10; #else int aa = 20; #endif #if 1 //if 后跟常量表达式 int cc = 50; //用法与 if 语句相同,常量表达式结果非0即真,真运行第一段,否则第二段 #else int cc = 60; #endif #ifdef kPrintf //如果定义过 kPrintf, 执行第一段...... #define printf(s, ...) printf(s,##__VA_ARGS__) #else #define printf(s, ...) #endif int main(int argc, const char * argv[]) { //结构体 // Student zhangsan ={"zhangsan",'m',26}; // // //访问结构体成员变量 // zhangsan.name; // zhangsan.sex; // zhangsan.age; // //打印 // PrintStuInfo(zhangsan); // //结构体数组 // //对数组 BJS[5]中,对学生 老大,老二,老三,老四,老五按照年龄进行排序 // Student laoda ={"老大",'m',23}; // Student laoer = {"老二",'w',18}; // Student laosan = {"老三",'w',22}; // Student laosi = {"老四",'m',30}; // Student laowu ={"老五",'m',35}; // // Student BJS[5] ={laoda,laoer,laosan,laosi,laowu}; // //遍历打印 // for (int i = 0; i < 5; i++) { // PrintStuInfo(BJS[i]); // } // //排序遍历打印 // SortStuByAge(BJS, 5); // for (int i = 0; i < 5; i++) { // PrintStuInfo(BJS[i]); // } // // // //结构体指针 // Student songmeng = {"宋猛",'m',16}; // Student *p_stu = NULL; // p_stu = &songmeng; //将宋猛的地址符赋值给 p_stu,p_stu 就指向宋猛 // // //*p_stu 就等价于 songmeng // //songmeng.name 等价于 (*p_stu).name 等价于 p_stu->name // printf("%s %s %s",songmeng.name,(*p_stu).name,p_stu->name); // // //访问结构体成员变量的方法 // //1.结构体变量.成员变量 // //2.(*结构体指针).成员变量 // //3.结构体指针 -> 成员变量 // // // // -> 指向操作符 // // // 定义两个CPoint结构体变量m,n // CPoint m ={2.0,5.0}; // CPoint n = {5.0,9.0}; // // // 使⽤用两个结构体指针分别指向m,n // CPoint *p_m = &m; // CPoint *p_n = &n; // //然后通过指针计算两点距离(提⽰示:1、勾股定理,2、开⽅方函数sqrt) // p_m->x; // p_n->y; // float _x = p_n->x - p_m->x; //横坐标的差值 // float _y = p_m->y - p_n->y; //纵坐标的差值 // // float result = sqrtf((_x * _x + _y * _y )); // printf("%.2f",result); // // // 请通过p将name成员中的第⼀个字母改成大写,所有’ ‘(空格)改成下 划线’_’ // // Student lanou ={"lan ou",'?',500}; // Student *p_lanou = &lanou; // // p_lanou->name[0] = 'L'; // p_lanou->name[3] = '_'; // printf("%s",p_lanou->name); // // (*p_lanou).name[0] = 'L'; // (*p_lanou).name[0] = '_'; // printf("%s",p_lanou->name); //结构体数组与指针的关系 // // Student aaa ={"aaa",'m',26}; // Student bbb = {"bbb",'m',15}; // Student ccc = {"ccc",'m',21}; // Student ddd ={"ddd",'m',18}; // Student eee = {"eee",'m',22}; // // Student BJS[5] = {aaa,bbb,ccc,ddd,eee}; // // Student *p_BJS = BJS; // // for (int i = 0 ; i < 5; i++) { // PrintStuInfo(*(p_BJS + i)); // } // //p_BJS + i 是地址 // //*(p_BJS + i)才是 // // p_BJS[0].name; // (*(p_BJS + 0)).name; // p_BJS->name; //通过结构体的地址直接找到结构体成员变量 // // // ( *(p_BJS + 4)).name; // (p_BJS+4)->age; // p_BJS[4].sex; // // // // //打印学生数组中的信息 // printStudents(p_BJS, 5); // // //按照年龄排序2 // // sortStuByAge2(p_BJS,5); // printStudents(p_BJS,5); // // //按姓名排序 // sortStuByName(p_BJS, 5); // printStudents(p_BJS, 5); // return 0; }
// Point.h/Point.m
<.h> #import <Foundation/Foundation.h> //定义一个点坐标的结构体CPoint,包含两个float 成员x,y typedef struct point{ float x; float y; }CPoint; <.m> #import "Point.h"
// Student.h/Student.m
<.h> #import <Foundation/Foundation.h> typedef struct student{ char name[20]; char sex; int age; }Student; void PrintStuInfo(Student stu1); void SortStuByAge(Student stu[],int count); void printStudents(Student * stu,int count); void sortStuByAge2(Student * stu,int count); void sortStuByName(Student * stu,int count); <.m> #import "Student.h" void PrintStuInfo(Student stu1){ printf("%s,%c,%d",stu1.name,stu1.sex,stu1.age); } //按照年龄排序 void SortStuByAge(Student stu[],int count){ for (int i = 0; i < count - 1 ;i++) { for (int j = 0 ; j < count - i -1; j++) { if (stu[j].age > stu[j + 1].age) { Student temp = stu[j]; stu[j] = stu[ j + 1 ]; stu[j + 1] = temp; } } } } //打印学生数组中的信息 void printStudents(Student * stu,int count){ for (int i = 0; i < count; i++) { PrintStuInfo(*(stu + i)); } } //按照年龄排序2 void sortStuByAge2(Student * stu,int count) { for (int i = 0 ; i < count - 1; i ++) { for (int j = 0; j < count - i - 1; j++) { if ((*(stu + j)).age > (*(stu + j + 1)).age) { Student temp = *(stu + j); *(stu + j) = *(stu + j +1); *(stu + j + 1) = temp; } } } } //姓名排序 void sortStuByName(Student * stu,int count){ for (int i = 0 ; i < count - 1; i++ ){ for (int j = 0;j < count - i - 1 ; j++){ if(strcmp((*(stu + j)).name,(*(stu + j + 1)).name ) > 0){ Student temp = *(stu + j) ; *(stu + j) = *(stu + j + 1); *(stu + j+ 1) = temp; } } } }