高级指针
指向结构体变量的指针,称为结构体指针
可以使用->指向内容。
%p打印地址
void pLenth(cPoint *p1,cPoint *p2)
//求两点间的距离 用的开方函数sqrt()和平方函数pow(,)
{
float a = sqrt(pow((p1->x-p2->x), 2)+pow((p1->y-p2->y), 2));
printf("两点距离为%.2f ",a);
}
//main.m中代码 #import <Foundation/Foundation.h> #import "Lesson.h" #import "Cpoint.h" int main(int argc, const char * argv[]) { Student stu = {"xiao wang tou",18,32,'m'}; Student *p = &stu; p->name[0] -= 32;//找到name第一个元素变大写 printf("%s ",p->name); //循环把空格字符变下划线 for (int i = 0; i<strlen(p->name); i++) { if (p->name[i]==' ') { p->name[i]='_'; } } printf("%s",p->name); // strcpy((*p).name, "xiaoliu"); // strcpy(p->name, "hello"); // printf("%lu %lu %s r",sizeof(stu),sizeof(p),(*p).name); // printf("%p %p",&(p->name),p); // Cpoint point1 = {1.25,2.36}; // Cpoint *q = &point1; // printf("%.2f %.2f ",q->x,q->y);//两种形式 // printf("%.2f %.2f",(*q).x,(*q).y); // Cpoint point2[]={{5,6},{8,10}}; // Cpoint *r = point2; // float num=sqrt((r->x-(r+1)->x)*(r->x-(r+1)->x)+(r->y-(r+1)->y)*(r->y-(r+1)->y)); // printf("%.2f",num); // mysqrt(point2); return 0; } //Cpoint.h中代码 typedef struct cpoint{ float x; float y; }Cpoint; void mysqrt(Cpoint point2[]); //Cpoint.m中代码 #import "Cpoint.h" void mysqrt(Cpoint point2[]){ Cpoint *r = point2; float num=sqrt((r->x-(r+1)->x)*(r->x-(r+1)->x)+(r->y-(r+1)->y)*(r->y-(r+1)->y)); printf("%.2f",num); } //Lesson.h中代码 //创建一个学生的结构体 typedef struct student{ char name[20];//姓名 int num; //学号 int age; //年龄 char sex; //性别 }Student;
结构体数组。
stu stus[3] = {0};
stu *p = &stus;
*(p+1).num 第二个学生的num
找出性别为男的学生,成绩加10,超过100写100
在student结构体中加score成员
//Lesson.h文件 typedef struct student{ char name[20];//姓名 int num; //学号 int age; //年龄 char sex; //性别 float score; //分数 }Student; void manscore(Student *stud,int count); //Lesson.m文件 //性别为男的学生成绩加10,如果超过100,成绩为100 void manscore(Student *stud,int count) { for (int i=0; i<count; i++) { if ((stud+i)->sex=='m') { (stud+i)->score+=10; if ((stud+i)->score>=100) { (stud+i)->score=100; } } printf("%.2f ",(stud+i)->score); } } //主函数 Student arr[3]={{"xiaoming",1,18,'m',95},{"xiaobai",2,20,'f',90},{"xiaoxiao",3,19,'m',56}}; Student *p = arr; // for (int i=0; i<3; i++) { // if ((p+i)->sex=='m') { // (p+i)->score+=10; // if ((p+i)->score>=100) { // (p+i)->score=100; // } // } // // printf("%.2f ",(p+i)->score); // } manscore(p, 3);
三、预编译指令
宏定义 实际开发中用的比较多
预编译时进行替换(编译前)
宏名命名规则: 纯大写 或者 k+驼峰
#define kMax 100
eg:MAX 或者 kMax
宏是符号常量不是变量 制作替换不做语法检查 后面没有分号;
带参数的宏
#define MUL(A,B) ((A)*(B))
#define kSum(A,B) A*B int main(int argc, const char * argv[]) { int a = kSum(3+5,6-3);//3+5*6-3 printf("%d",a);//输出30
条件编译
作用:按不同的条件,编译不同的代码。
条件编译 有三种形式
1.#ifdef 标识符
代码段1
#else
代码段2
#endif
//如果定义了宏AAA #ifdef AAA printf("这段代码被编译"); #else printf("这段代码才被编译"); #endif//编译结束以#endif结束
2.#ifndef 标识符
代码段1
#else
代码段2
#endif
3.#if 常量表达式
代码段1
#else
代码段2
#endif