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

来源:互联网 发布:excle怎么做数据分析 编辑:程序博客网 时间:2024/04/30 13:38

//

//  main.m

//  C08 高级指针-1

//

//  Created by 康亮亮 on 15/10/16.

//  Copyright (c) 2015 Darling.com. All rights reserved.

//


#import <Foundation/Foundation.h>

// 声明一个结构体类型student:成员变量有:nameagescoregender

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

    

    

    

    /*练习1

     定义⼀一个点坐标的结构体CPoint,包含两个float成员x,y定义两个CPoint结构体变量m,n

     使⽤用两个结构体指针分别指向m,n然后通过指针计算两点距离(提⽰示:1、勾股定理,2、开⽅方函数sqrt)*/

    

    // 定义两个Cpoint结构体变量

   Cpoint a = {1,2};

   Cpoint b = {4,4};

    

    //使用两个结构体指针分别指向ab

   Cpoint *p1 = &a;

   Cpoint *p2 = &b;

    

    //通过指针计算两点距离

   float result = length(p1,p2);

    printf("%.2f\n", result);

    

    

    

    /*练习2

     student stu = {1,”lan ou”,’m’,95.6};

     student * p = &stu;

     请通过pname成员中的第一个字母改成大写,所有’ ‘(空格)改成下划线’_’

     */

   Stu stu = {1,"lan ou",'m',95.6};

   Stu *stuP = &stu;

    //通过pname成员中的第一个字母改成大写

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

    

    

    /*练习3

     使⽤指针 查找学员数组中性别为男的学员,成绩增加10,超过100分的记为100)

     */

   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;

}


0 0