C实训(五)

练习与注意事项:

1.结构体

struct student {
    char name[20];
    int age;
    BOOL gender;
};
  • 结构体要定义在main()函数之外

2.类型重定义,将一个数据类型的名称再起另一个名字,以后再定义这个类型的变量的时候可以使用别名作为类型,方便书写

typedef struct teacher{
    char name[20];
    int age;
}Teacher;
typedef int nihao;
void change(int *a);

3.main()函数进行实现:

    struct student stu1 = {"zhangsan", 18, YES};
    printf("name = %s\n",stu1.name);    //结构体的访问方式
    printf("age = %d\n",stu1.age);
    struct student stu2 = {"lisi",30, NO};
    //修改成员变量
    stu2.gender = YES;
    strcpy(stu2.name, "lis");
    printf("修改后的名字:%s\n",stu2.name);
    
    Teacher teacher = {"帅哥\n",1};
    printf(teacher.name,teacher.age);

4.数组

    //取内容运算符:*
    int b = 10;
    change(&b);
    printf("%d", b);
    
    char str[20];
    scanf("%s",str);    //数组不需要&符号,数组不是指针

    int array[10] = {0};
    printf("array -> \t%p\n",array);
    printf("&array -> \t%p\n",&array);
    printf("array -> \t%p\n",array + 1);
    printf("&array + 1 -> \t%p\n",&array + 1);

5.冒泡排序回顾

    int a[] = {1,2,3,4,5,6,7,8,9,10,11,12,84,15,97,23,75,87,345,93};
    int *p1 = a;
    BOOL f = YES;
    for (int j = 0; j < 20; j++) {
        f = NO;
        for (int i = 0; i < 20 - 1 - j; i++) {
            if (*(p1 + i) > *(p1 + i + 1)) {
                int temp = *(p1 + i + 1);
                *(p1 + i + 1) = *(p1 + i);
                *(p1 + i) = temp;
                f = YES;
            }
        }
    }
    
    for (int i = 0; i < 20; i++) {
        printf("%d",*(p1 + i));
    }

6.静态变量

    for (int i = 0; i < 10; i++) {
        //静态变量只能被初始化一次
        static int n = 10;
        printf("%d\n",n);
        n++;
    }

7.在堆内存申请8个字节的内存空间,并将该空间的首地址返回,将该地址赋值给char型指针

    char *str = malloc(8);
    strcpy(str, "iPhone");
    printf("%s\n",str);
    free(str);

8.内存标记已经清除,再次通过该指针访问这块内存空间可能会发生错误,这种错误我们叫野指针错误

    printf("%s\n",str);
    int *num = malloc(sizeof(int));
    *num = 4;
    printf("%d",*num);

9.内存溢出 内存泄露

free(num);

10.防止野指针错误

num = NULL;
//printf("%d\n",*num);

知识点:

1.结构体的嵌套

struct car {
    char carName[20];
    int carNum;
};
typedef struct car Car;
struct person {
    char name[20];
    Car car;
};

2.结构体嵌套时,应注意避免使用结构体本身, 如下写法是错误的:

struct person {
    char name[20];
    struct person per;
};

3.指针:

与指针相关的概念:
1️⃣内存地址:编号对应的内存以字节为单位划分。
2️⃣内存地址的大小:32位操作系统占4字节,64位操作系统占8个字节。
3️⃣指针变量:特指存储内存地址的变量。
4️⃣指针变量的算数运算:指针不是类型,真正的类型是地址,指针(指针变量)是指存储地址这种数据类型的数据的变量。
5️⃣指针变量的数据类型:指针变量的数据类型只限定了指针在参与算数运算的时候一次偏移多少个字节,通过*取内容的时候读取多少个字节。
6️⃣静态存储器
7️⃣malloc内存分配函数分配
8️⃣动态内存分配:
void *malloc(unsigned int aize);
void *:泛型,可以代表所有的指针类型。

作业:

1.定义Person结构体,成员变量为姓名,年龄,性别,定义三个该结构体的变量,定义函数,打印年龄最小的那个人的姓名

typedef struct person{
    char name[20];
    int age;
    BOOL gender;
}Person;

//比较的人少的情况
void yoursAge(Person p1, Person p2, Person p3){
    Person minP = p1.age < p2.age ? p1 : p2;
    Person minFP = minP.age < p3.age ? minP :p3;
    printf("年龄最小的是:%s\n",minFP.name);
}

//人多的情况(数组形式)
void findMinAgePersonByArray(Person pArr[], int count){  //数组和数组长度
    if (count > 0) {
        Person minAgeP = pArr[0];
        for (int i = 1; i < count; i++) {
            if (minAgeP.age > pArr[i].age) {
                minAgeP = pArr[i];
            }
        }
        printf("%s\n",minAgeP.name);
    }

}

void yoursAge(Person t1, Person t2, Person t3);

void findMinAgePersonByArray(Person pArr[], int count);

int main(int argc, const char * argv[]) {
    Person p1 = {"张三", 30, YES};
    Person p2 = {"李四", 28, NO};
    Person p3 = {"王五", 25, YES};
    yoursAge(p1,p2,p3);
    
    Person pArray[] = {p1, p2, p3};
    findMinAgePersonByArray(pArray, sizeof(pArray) / sizeof(Person));
    return 0;
}

2.输入一个数组长度,动态创建数组存储整数,所有元素为随机生成[10,30]之间的数,输出元素中的最大值。

int main(int argc, const char * argv[]) {
    int count = 0;
    printf("输入数组长度:");
    scanf("%d",&count);
    int *array = malloc(sizeof(int) * count);
    int max = 0;
    for (int i = 0; i < count; i++) {
        array[i] = arc4random() % (30 - 10 + 1) + 10;  //array[i] = *(array + i)两个等价
        printf("随机数为:%d\n",array[i]);
        if (max < array[i]) {
            max = array[i];
        }
    }
    printf("最大值为:%d\n",max);
    
    return 0;
}

3.编写函数swap交换两个在堆空间存储的浮点数的值

void swap(float *a, float *b){
    float t = *b;
    *b = *a;
    *a = t;
    printf("交换后的两个值为:%f,%f\n",*a, *b);
}

void swap(float *a, float *b);

int main(int argc, const char * argv[]) {
    float *a = malloc(sizeof(float));
    float *b = malloc(sizeof(float));
    *a = 10;
    *b = 20;
    swap(a, b);
    free(a);
    a = NULL;
    free(b);
    b = NULL;
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,552评论 1 51
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,515评论 3 44
  • 注:这是第三遍读《C语言深度解剖》,想想好像自从大学开始就没读完过几本书,其中谭浩强的那本《C语言程序设计(第四版...
    HavenXie阅读 1,814评论 1 6
  • 小七与小美是一起进入公司的新人,同期只有两个女生,于是自然而然的一起吃饭,一起休息,一起讨论,一起逛街,成为好朋友...
    九悠阅读 189评论 0 4
  • 昨天3月8号,妇女节,虽说名字不好听,但也是个节日,一般公司会安排活动也会发一波福利。我们就组织的是微景观制作。...
    蜗娄牛阅读 360评论 0 1