//
// main.m
// C08 高级指针-1
//
// Created by 康亮亮 on 15/10/16.
// Copyright (c) 2015年 Darling.com. All rights reserved.
//
#import <Foundation/Foundation.h>
// 声明一个结构体类型student:成员变量有:name,age,score,gender
typedef struct student {
char name[20];
int age;
float score;
char gender;
}Student; // 结构体的数据结构和OC中的类非常相似,OC中的类使用结构体的方式来管理。OC中的类名首字母一般大写,所以在给结构体重命名时也要大写。
//练习1
typedef struct cpoint{
float x;
float y;
}Cpoint;
float length(Cpoint *p1, Cpoint *p2){
// float xLength = ((*p1).x - (*p2).x )*((*p1).x - (*p2).x);
float xLength = (p1->x - p2->x) * (p1->x - p2->x);
// float xLength = ((*p1).y - (*p2).y )*((*p1).y - (*p2).y);
float yLength = (p1->y - p2->y) * (p1->y - p2->y);
float sumLength = xLength + yLength;
float result = sqrt(sumLength);
return result;
}
//练习1
typedef struct stu{
int no;
char name[20];
char gender;
float score;
}Stu;
//练习2
typedef struct printstu{
int no;
char name[20];
char gender;
float score;
}printstu;
//练习3 函数功能:查找学员数组中性别为男的学员,给他成绩增加10分,超过100分的记为100分
void jiaFen(Stu *p, int count){
for (int i = 0; i <count ; i++) {
if ((p+i)->gender == 'm' ) {
(p+i)->score += 10;
if ((p+i)->score > 100) {
(p+i)->score = 100;
}
}
}
}
//练习3 将打印输出功能封装在一个函数里(比较结构体指针作为参数,结构体数组作为参数的区别)
void printStu(Stu *p, int count){ //指针作为参数,要加一个元素个数
for (int i = 0; i < count; i++) {
printf("name = %s, gender = %c, score = %.2f\n",(p+i)->name, (p+i)->gender, (p+i)->score);
}
}
//void printStu(Stu students[], int count){ //数组作为参数,要加一个元素个数
// for (int i = 0; i < count; i++) {
// printf("name = %s, gender = %c, score = %.2f\n",students[i].name, students[i].gender, students[i].score);//访问元素的方式不同!!!
// }
//}
int main(int argc, const char * argv[]) {
#pragma mark 8.1 结构体指针
//
// 定义一个Student类型的结构体变量:stu1
Student stu1 = {"xiaoMing", 25, 96.50, 'f'};
// 使用结构体变量名+.+成员变量名的方式访问
printf("stu1.name = %s\n", stu1.name);
printf("stu1.gender = %c\n", stu1.gender);
// 定义一个指针,来指向这个结构体变量
Student *p = &stu1;
// 使用指针访问结构体变量的成员变量
// 方法一:先取出结构体变量的值,然后通过.找到他的成员变量
printf("(*p).name = %s\n", (*p).name); // 由于.运算优先级比*高,所以使用.()干预他们的运算顺序
printf("(*p).age = %d\n", (*p).age);
// 方法二:使用 指针名 + -> 访问结构体的成员变量
printf("p->age = %d\n", p->age);
printf("p->name = %s\n", p->name);//指向成员变量name首地址
printf("p->gender = %c\n", p->gender);
// 访问name成员变量的首个字符
printf("*(p->name) = %c\n", *(p->name));// 取出指向成员变量name首地址值x
// 访问name成员变量的第2个字符
printf("*(p->name + 1) = %c\n", *(p->name + 1));// 取出指向成员变量name第二个地址值i
char str[] = "hello";
char *p3 = str; // 可修改
printf("%s\n",p3);
printf("%c\n",*p3);
printf("%c\n",*(p3 + 4));
// 定义两个Cpoint结构体变量
Cpoint a = {1, 2};
Cpoint b = {4, 4};
// 使用两个结构体指针分别指向a,b
Cpoint *p1 = &a;
Cpoint *p2 = &b;
// 通过指针计算两点距离
float result = length(p1,p2);
printf("%.2f\n", result);
Stu stu = {1,"lan ou",'m',95.6};
Stu *stuP = &stu;
//通过p将name成员中的第一个字母改成大写
for (int i = 0; i < strlen(stuP->name); i++) {
if (*(stuP->name) > 'a' && *(stuP->name) < 'z') {
*(stuP->name) = *(stuP->name) - 32;
}
// ’ ‘(空格)改成下 划线’_’
if (*(stuP->name+i) == ' ') {
*(stuP->name+i) = '_';
}
}
printf("%s\n", stuP->name);
#pragma mark 8.2 指针与结构体数组
Stu students[5] = {
{1, "zhiNan", 'f', 22.22},
{2, "jackChen", 'm', 33.33},
{3, "xiaoKang", 'f', 44.44}
};
// 定义一个结构体指针,指向数组students
Stu *sp = students;
// 使用数组名+下标的方式,访问第一个元素的name成员变量
printf("%s\n", students[0].name);
// 使用指针取值的方式,访问第二个元素的no成员变量(不常用)
printf("%d\n",(*(sp + 1)).no);
// 使用指针 + —>的方式访问第三个元素gender成员变量
printf("%c\n", (sp+2)->gender);
Stu studs[5] = {
{1, "jolin", 'f', 22.22},
{2, "jay", 'm', 33.33},
{3, "jack", 'f', 44.44},
{4, "darling", 'm', 91},
{3, "steven", 'm', 44.44}
};
// 定义一个结构体指针,指向数组studs
Stu *ps = studs;
//
jiaFen(ps, 5);
printStu(ps,5);
return 0;
}