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

时间:2022-11-24 00:27:14
------ 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培训、期待与您交流! -------