天天看点

iOS开发学习之C语言---C08 高级指针-1

//

//  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;

}

继续阅读