黑马程序员-IOS学习笔记-C语言基础其他数据类型及总结
2015-02-02 16:40
871 查看
------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> 使用注意:
由于计算机中寄存器数目有限,不能使用太多的寄存器变量。如果寄存器使用饱和时,程序将寄存器变量自动转换为自动变量处理
为了提高运算速度,一般会将一些频繁使用的自动变量定义为寄存器变量,这样程序尽可能的为它分配寄存器存放,而不用内存。
结构体允许内部的元素是不同类型的。结构体内部的元素,也就是组成部分,我们一般称为”成员“。
定义格式:struct是关键字,式结构体类型的标志。
结构体内存分析
结构体作为函数参数:
将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参
------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); 9fad printf("修改后的实参:%d \n", stu.age); return 0; }
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
相关文章推荐
- 黑马程序员-IOS-C语言基础-其他数据类型及总结
- iOS学习笔记之-C语言基础02(关键字、标识符、注释、数据类型)
- 黑马程序员-IOS学习笔记-C语言基础复杂数据类型
- 黑马程序员——零基础学习iOS开发——05 C语言:进制、内存储存细节、类型说明符、位运算、数组
- 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】07-基本数据类型
- 黑马程序员--IOS入学学习--5-其他数据类型及递归
- 黑马程序员_iOS开发C语言基础之枚举类型和数据类型总结
- 黑马程序员_java基础学习笔记01_变量,数据类型,运算符
- 黑马程序员之ios学习总结——06 C语言的变量类型和结构体
- 【黑马程序员】C语言学习笔记之基本数据类型(六)
- 黑马程序员-iOS基础-C语言基础(六)-复杂数据类型及其他
- 【黑马程序员】 我的C语言学习笔记(1)数据类型
- 黑马程序员——ios基础---C语言:数据类型、运算符、选择结构
- 【零基础学习iOS开发】【02-C语言】07-基本数据类型
- ios学习笔记之基础数据类型的转换
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之10-变量和数据类型——黑马 IOS 技术博客
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之04-数据类型和表达式——黑马 IOS 技术博客
- 黑马程序员—Java基础学习笔记之数据类型转换(自动转换和强制转换)
- 黑马程序员——ios开发基础之C语言数据类型、运算符与输入输出