黑马程序员 《ios零基础教程》--全局和局部变量、结构体、枚举 2014-4-2总结

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------



前几天出差有事儿没学习,今天主要学习了复杂数据类型中的一些其他类型


一、其他数据类型

1.全局变量和局部变量

#include <stdio.h>

/*
 根据变量的作用域,可以分为:
 1.局部变量:
 1>定义:在函数(代码块)内部定义的变量(包括函数的形参)
 2>作用域:从定义变量的那一行开始,一直到代码块结束
 3>生命周期:从定义变量的那一行开始分配存储空间,代码块结束后,就会被回收
 4>没有固定默认的初始值就是0
 
 2.全局变量
 1>定义:在函数外面定义的变量
 2>作用域:从定义变量的那一行开始,一直到文件结尾(能被后面的所有函数共享)
 3>生命周期:程序已启动就会分配存储空间,程序退出时才会被销毁
 4>默认的初始值就是0
 */

int age;

void test()
{
    int age;
    age = 10;
    printf("%d\n",age);
}

int main(int argc, const char * argv[])
{
    printf("%d\n",age);
//    int age = 20;
    printf("%d\n",age);
    
    test();
    
    printf("%d\n",age);
    return 0;
}

2.结构体

1>基本使用
#include <stdio.h>

/*
 数组:只能由多个相同类型的数据构成
 
 结构体:可以由多个不同类型的数据构成
 */

int main(int argc, const char * argv[])
{
//    int ages[3]= {10, 11 , 29};
    
    //1.定义结构体类型
    struct Person
    {
        //里面的3个变量,可以称为是结构体的成员或者属性
        int age;//年龄
        double height;//身高
        char *name;//姓名
    };
    
    //2.根据结构类型,定义结构体变量
    struct Person p = {20, 1.55, "jack"};
    p.age = 30;
    p.name = "rose";
   
    printf("age=%d, name=%s, heigth=%f\n",p.age,p.name,p.height);
    
    /*错误写法
     struct Person p2;
     p2 = {20 ,1.67,"jack"};
     
     相当于
     int ages[5];
     age = {1 ,2 , 3 ,5 ,2};
     是错误的
     */
    
    struct Person p2 = {.height = 1.78 ,.name = "joke",.age = 46};
    printf("age=%d, name=%s, heigth=%f",p2.age,p2.name,p2.height);
    return 0;
}

2>内存分析
#include <stdio.h>

void test();
void test1();

int main(int argc, const char * argv[])
{
    test1();
    test();
    
    return 0;
}

void test1()
{
    struct Student
    {
        int age;//4个字节
        
        char a;//1个字节
        
        char *name;//8个字节
    };
    
    struct Student stu;
    //stu.age = 20;
    //stu.name = "jack";
    //补齐算法(对齐算法) 本节中有详解,看
    //结构体所占用得存储空间 必须是 最大成员字节数的倍数
    
    int s = sizeof(stu);
    printf("%d\n",s);
}


void test()
{
    //1.定义结构体类型(并不会分配存储空间)
    struct Date
    {
        int year;
        int month;
        int day;
    };
    
    //2.定义结构体变量(真正分配存储空间)
    struct Date d1 = {2011, 4 ,10};
    
    struct Date d2 = {2013 , 8 , 9};
    
    //会讲d1所有成员的值对应的值赋值给d2的所有成员
    d2 = d1;
    
    d2.year = 2010;
    printf("%d - %d -%d\n",d1.year ,d1.month ,d1.day);
    printf("%d - %d -%d\n",d2.year ,d2.month ,d2.day);
    
    d2.month = 12;
    
    /*
    printf("%p - %p -%p\n",&d1.year ,&d1.month ,&d1.day);
    
    int s = sizeof(d1);
    printf("%d\n",s);
     */
}

3>变量的多种定义
#include <stdio.h>

/*
 1.定义结构体变量的3种方式
 1>先定义类型,再定义变量(分开定义)
 struct Student
 {
    int age;
 };
 struct Student stu;
 
 2>定义类型的同时定义变量
 struct Student
 {
    int age;
 }stu;
 struct Student stu2;
 
 3>定义类型的同时定义变量(省略了类型名称)
 strct
 {
    int age;
 }stu;
 */

int main(int argc, const char * argv[])
{
    //定义结构体变量的第3种方式,但是这种方式只能使用一次,下次使用还需要重新定义
    struct{
        int age;
        char *name;
    }stu;
    
    /*结构类型不能重复定义  这是错误写法
     struct Student
     {
        int age;
     };
     
     struct Student
     {
        double height;
     };
     
     struct Student stu;
     */
    
    /*错误写法:结构体类型重复定义
     struct Student
     {
        int age;
        double height;
        char *name;
     }stu;
     
     struct Student
     {
     int age;
     double height;
     char *name;
     }stu2;
     
     */
    
    /*
     这句代码做了两件事情
     1.定义结构体类型
     2.利用新定义好的类型来定义结构体变量
     */
    
    //定义变量的第2种方式:定义类型的同时定义变量
    /*
     struct Student
     {
         int age;
         double height;
         char *name;
     }stu;
     
     struct Student stu2;
     */
    
    /*
     //定义变量的第1种方式:
     //1.类型
     struct Student
     {
        int age;
        double height;
        char *name;
     };
     
     //2.变量
     struct Student stu = {20 , 1.78 ,"jack"};
     */
    
    return 0;
}

4>结构体数组
#include <stdio.h>

int main(int argc, const char * argv[])
{
    struct RankRecord
    {
        int no;
        char *name;
        int score;
    };
    
    /*
     struct RankRecord r1 = {1 , "jack" , 5000};
     struct RankRecord r2 = {2 , "jim" , 500};
     struct RankRecord r3 = {3 , "jake" ,300};
     */
    
    //int ages[3] = {10 ,19 ,29};
    
    //int ages[3];
    //对齐算法
    //能存放3个结构体变量,每个机构体变量占16个字节
    
    struct RankRecord records[3]=
    {
        {1,"jack",5000},
        {2,"jim",500},
        {3,"jake",300}
    };
    
    records[0].no = 4;
    //错误写法
    //records[0] = {4, "rose" ,9000};
    
    for (int i = 0; i < 3; i++)
    {
        printf("%d\t%s\t%d\n",records[i].no,records[i].name,records[i].score);
    }
    
    //这里为什么size=24,而不是size=16
    printf("size=%d\n",sizeof(records[1]));
    return 0;
}

5>指向结构体的指针
#include <stdio.h>
/*
 1.指向结构体的指针的定义
 struct Student *p;
 
 2.利用指针访问结构体的成员
 1>(*p).成员变量
 2>p->成员变量
 */

int main(int argc, const char * argv[])
{
    struct Student
    {
        int no;
        int age;
    };
    
    //结构体变量
    struct Student stu = {1 ,20};
    
    //指针变量p将来指向struct Student类型的数据
    struct Student *p = &stu;
    
    //指针变量p指向了stu变量;
//    p = &stu;
//    
    p->age = 30;
    
    //第一种方式
    printf("age=%d, no=%d\n",stu.age,stu.no);
    
    //第二种方式
    printf("age=%d, no=%d\n",(*p).age,(*p).no);
    
    //第三种方式
    printf("age=%d, no=%d\n",p->age,p->no);
    return 0;
}

6>嵌套定义
#include <stdio.h>

int main(int argc, const char * argv[])
{
    struct Date
    {
        int year;
        int month;
        int day;
    };
    
    //类型
    struct Student
    {
        int no;//学号
        
        struct Date birthday;//生日
        
        struct Date ruxueDate;//入学日期
        
        //这种写法是错误的
        //struct Student stu;
    };
    
    struct Student stu = {1 , {2000,9,10},{2012,9,10}};
    
    printf("year=%d,month=%d,day=%d\n",stu.birthday.year,stu.birthday.month,stu.birthday.day);
    return 0;
}

3.枚举类型

//枚举用在有特殊规定使用整数的变量,变量之间依次递增
#include <stdio.h>

int main(int argc, const char * argv[])
{
    //1.定义枚举类型
    enum Season
    {
        spring,
        summer,
        autumn,
        winter
    };
    
    //2.定义枚举变量
    enum Season s = spring;
    enum Season s2 = summer;
    enum Season s3 = autumn;
    enum Season s4 = winter;
    
    printf("%d\n",s);
    printf("%d\n",s2);
    printf("%d\n",s3);
    printf("%d\n",s4);
    return 0;
}

4.数据类型总结

/*
 一、基本数据类型
 1.int
 
 1>long int、long:8个字节  %ld
 2>short int、short:2个字节  %d %i
 3>unsigned int、unsigned:4个字节 %zd
 4>signed int、signed 、int:4个字节 %d %i
 
 2.float\double
 1>float:4个字节  %f
 2>double:8个字节  %f
 
 3.char
 1>1个字节 %c %d
 2>char类型保存在内存中得是它的ASCII值
    ‘A’-->65
 
 二、构造类型
 1.数组
 1>只能由同一种类型的数据组成
 2>定义:数据类型  数组名[元素个数];
 
 2.结构体
 1>可以由不同类型的数据组成
 2>先定义类型,再利用类型定义变量
 
 三、指针类型
 1.变量的定义
 int *p;
 
 2.间接操作变量的值
 int a = 10;
 p = &a;
 *p = 20;
 
 四、枚举类型
 使用场合:当一个变量只允许有几个固定取值时
 
 */






---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值