黑马程序员-IOS学习笔记-C语言基础其他数据类型及总结

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

变量类型

1,变量的作用域

C语言根据变量作用域的不同,将变量分为局部变量和全局变量。

<1>.局部变量

1> 定义:在函数内部定义的变量,称为局部变量。形式参数也属于局部变量。

2> 作用域:局部变量只在定义它的函数内部有效,即局部变量只有在定义它的函数内部使用,其它函数不能使用它。

 <2>.全局变量

1> 定义:在所有函数外部定义的变量,称为全局变量。

2> 作用域:全局变量的作用范围是从定义变量的位置开始到源程序结束,即全局变量可以被在其定义位置之后的其它函数所共享。

2,变量的存储类型

在C语言中根据变量的存储类型,变量可以分为:自动变量,静态变量,寄存器变量。

<1>,自动变量

1> 定义:自动变量是存储在堆栈中的。

2> 哪些是自动变量:被关键字auto修饰的局部变量都是自动变量,但是极少使用这个关键字,基本上是废的,因为所有的局部变量在默认情况下都是自动变量。

3> 生命周期:在程序执行到声明自动变量的代码块(函数)时,自动变量才被创建;当自动变量所在的代码块(函数)执行完毕后,这些自动变量就会自行销毁。如果一个函数被重复调用,这些自动变量每次都会重新创建。

<2>,静态变量

1> 定义:静态变量是存储在静态内存中的,也就是不属于堆栈。

2> 哪些是静态变量:所有的全局变量都是静态变量;被关键字static修饰的局部变量也是静态变量。

3> 生命周期:静态变量在程序运行之前创建,在程序的整个运行期间始终存在,直到程序结束。

<3>,寄存器变量

1> 定义:存储在硬件寄存器中的变量,称为寄存器变量。寄存器变量比存储在内存中的变量访问效率更高(默认情况下,自动变量和静态变量都是放在内存中的)

2> 哪些变量是寄存器变量:

a,被关键字register修饰的自动变量都是寄存器变量;

b,只有自动变量才可以是寄存器变量,全局变量和静态局部变量不行;

c,寄存器变量只限于int、char和指针类型变量使用。

3> 生命周期:因为寄存器变量本身就是自动变量,所以函数中的寄存器变量在调用该函数时占用寄存器中存放的值,当函数结束时释放寄存器,变量消失。

4> 使用注意:

由于计算机中寄存器数目有限,不能使用太多的寄存器变量。如果寄存器使用饱和时,程序将寄存器变量自动转换为自动变量处理

为了提高运算速度,一般会将一些频繁使用的自动变量定义为寄存器变量,这样程序尽可能的为它分配寄存器存放,而不用内存。

结构体

1,结构体的定义
结构体允许内部的元素是不同类型的。结构体内部的元素,也就是组成部分,我们一般称为”成员“。
定义格式:struct是关键字,式结构体类型的标志。
/*
 数组:只能由多个相同类型的数据构成

 结构体:可以由不同类型的数据构成
 
*/


#include <stdio.h>

int main()
{
    //1.定义结构体类型
    struct Person
    {   //里面的三个变量,可以成为是结构体的成员或者属性
        int age;//年龄
        double height;//身高
        char *name;//姓名
    };
    
    
    //2.根据结构体类型,定义结构体变量
    struct Person p = {20,1.82,"Tom"};
    
   
    
    
    printf("年龄%d,身高%f,姓名%s\n",p.age,p.height,p.name);
    //不按照结构体内的顺序写也可以,参考下面
    struct Person p2 = {.name = "Tom",.age = 20,.height = 1.82};
    
    printf("年龄%d,身高%f,姓名%s\n",p.age,p.height,p.name);

    
    return 0;
}

                                                                                  结构体内存分析
#include <stdio.h>

int main()
{
    
    return 0;
}

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

}


//结构体内存细节
void test()
{
    //1.定义结构体类型(并不会分配存储空间)
    struct Date
    {
        int year;
        int month;
        int day;
    };
    
    //2.定义结构体变量
    struct Date d1 = {2011,4,10};//2个结构体互不影响,每个结构体有自己的空间
    
    struct Date d2 = {2015,8,9};
    
    //会将d1多有成员的值对象的赋值给d2的所有成员
    d2 = d1;
    
    printf("%d-%d-%d\n",d1.year,d1.month,d1.day);
    
    printf("%d-%d-%d\n",d2.year,d2.month,d2.day);
    

}
结构体注意点
#include <stdio.h>

int main()
{
    /*
     这句代码做了两件事情
     1.定义结构体类型
     2.利用新定义好的类型来定义结构体变量
     
    //定义变量的 第2种 方式: 定义类型的同时定义变量
    struct Student
    {
        int age;
        char *name;
        double height;
        
    }stu;
    
    struct Student stu2;
     
     */
     
     
    /*
      //定义变量的一种方式
    //1.类型
    struct Student
    {
        int age;
        char *name;
        double height;
    
    };
    
    //2.变量
    struct Student stu = {20,"Tom",1.82};
     */
    return 0;
}


结构体作为函数参数:

将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参

 #include <stdio.h>
 
 // 定义一个结构体
 struct Student

{
     int age;
 };
 
 void test(struct Student stu) {
     printf("修改前的形参:%d \n", stu.age);
     // 修改实参中的age
     stu.age = 10;
     
     printf("修改后的形参:%d \n", stu.age);
 }
 
 int main(int argc, const char * argv[]) {
     
     struct Student stu = {30};
     printf("修改前的实参:%d \n", stu.age);
     
     // 调用test函数
     test(stu);
     
     
     printf("修改后的实参:%d \n", stu.age);
     return 0;
 }



------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值