黑马程序员———C语言———【一维数组】
2015-08-11 18:42
447 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
-------
一、定义变量时的地址分配
例:3的二进制是 [高位] 00000000000000000000000000000011 [低位]
0、一个内存单元是一个字节。每个内存单元都有唯一的一个地址。
1、先定义的变量分配的是高地址,后定义的变量分配的是低地址。(在内存中,高地址在下面,低地址在上面)
2、低位字节存在低地址,高位字节存在高地址。
3、变量的地址:变量的首地址(变量在内存中占用的存储单元中地址最小的那个地址)
案例:
二、char类型数据存储问题
首先,变量a是以ascii码值的形式存储在内存单元中的。
len2的值:先找到'a'的ascii吗值,97。把97按照int类型进行二进制转换。
97的二进制数据为:00000000 00000000 00000000 01100001
综上,他存储的是4个字节。
len1的值:先找到'a'的ascii吗值,97。把97按照int类型进行二进制转换。
因为ch是char类型数据,只占一个字节,所以只存储一个字节的内存地址,即01100001
综上,他存储的是1个字节。
总结:char类型的常量和变量存储方式是不一样的。
延伸:因为字符是以ascii码的形式存储,所以A和a的ascii码值是不相同的。所以可以在大小写之间切换。大小写相差值为32
三、一维数组
0、数组:相同类型的若干个数据组成一个有序的集合。
1、概念:如果一个数组的所有元素都不是数组,那么这个数组就是一维数组。
2、定义:类型说明符 数组名[常量表达式];
3、注意事项:
(1)数组的长度可以是一个常量,也可以是常量表达式
(2)数组名的命名规则:严格按照标识符的命名规则
(3)数组名不能和其他变量同名
(4)数组的长度不可以为一个变量(C99标准要求的)
(5)数组的长度可以使用宏定义
(6)定义数组的时候还可以定义普通变量
4、初始化
(1)定义的同时初始化
1)完全初始化
形式1:int num[4]={12,3,4};
形式2:int num[]={1,2,3,4}
2)部分初始化
形式1:int num[4]={1,2};
没初始化的元素值为0.
形式2:int num[10]={[3]=8,[4]=123};
没初始化的元素值为0.
(2)先定义,后初始化
int num[4];
num[4]={12,3,4,5};
5、(1)如果数组没有被初始化,那么数组中到底有没有值?有是多少?
有值,垃圾值。
(2)如果数组部分初始化,那么数组中没有被初始化的元素有没有值?有是多少?
有值。
如果是int类型的数租,那么剩余元素的值为0.
如果是float类型的数组,那么剩余元素的值为0.000000
如果是char类型的数组,那么剩余元素的值的ascii码的值为0
特别强调:使用先定义后初始化的方式,如果部分元素被初始化了,系统不会对没有初始化的那部分元素赋值为0
6、遍历数组
7、存储方式
数组的首地址:数组的第一个元素首地址(第一个元素的第一个字节地址)。
先存入的元素处于低地址,后存入的与元素处于高地址。
数组名是一个常量,它存储的是数组的首地址。
8、长度计算方法
数组长度=数组占用的总字节数/数组元素占用的字节数
9、一维数组越界问题
数组越界即使没有报错,也是不安全的,因为数据有可能会丢失,这个空间不属于你。
10、案例:输入10个数字,并输出10个数字中最大的数
11、数组元素作为函数参数
12、数组作为函数参数
需要注意的是:
用数组名作为函数参数,传递的是地址
实参是数组名numbers,形参是nums
此时,numbers和nums在内存中代表了同一块内存空间
13、数组名作为函数参数需要注意的点
1、形参数组的类型和长度要和实参一致,如果类型不一致,会造成错误。
2、实参的类型和形参的类型不匹配
3、形参的数组的长度和实参的长度可以不一致,随不会报错,单运行的结果和实际不相符
4、形参数组的数组长度可以不写
5、数组作为实参传递到被调函数中,被调函数的形参数组的长度为8.因为传递的是地址,所有类型的地址都占8个字节
-------
一、定义变量时的地址分配
例:3的二进制是 [高位] 00000000000000000000000000000011 [低位]
0、一个内存单元是一个字节。每个内存单元都有唯一的一个地址。
1、先定义的变量分配的是高地址,后定义的变量分配的是低地址。(在内存中,高地址在下面,低地址在上面)
2、低位字节存在低地址,高位字节存在高地址。
3、变量的地址:变量的首地址(变量在内存中占用的存储单元中地址最小的那个地址)
案例:
二、char类型数据存储问题
首先,变量a是以ascii码值的形式存储在内存单元中的。
len2的值:先找到'a'的ascii吗值,97。把97按照int类型进行二进制转换。
97的二进制数据为:00000000 00000000 00000000 01100001
综上,他存储的是4个字节。
len1的值:先找到'a'的ascii吗值,97。把97按照int类型进行二进制转换。
因为ch是char类型数据,只占一个字节,所以只存储一个字节的内存地址,即01100001
综上,他存储的是1个字节。
总结:char类型的常量和变量存储方式是不一样的。
延伸:因为字符是以ascii码的形式存储,所以A和a的ascii码值是不相同的。所以可以在大小写之间切换。大小写相差值为32
三、一维数组
0、数组:相同类型的若干个数据组成一个有序的集合。
1、概念:如果一个数组的所有元素都不是数组,那么这个数组就是一维数组。
2、定义:类型说明符 数组名[常量表达式];
3、注意事项:
(1)数组的长度可以是一个常量,也可以是常量表达式
(2)数组名的命名规则:严格按照标识符的命名规则
(3)数组名不能和其他变量同名
(4)数组的长度不可以为一个变量(C99标准要求的)
(5)数组的长度可以使用宏定义
(6)定义数组的时候还可以定义普通变量
4、初始化
(1)定义的同时初始化
1)完全初始化
形式1:int num[4]={12,3,4};
形式2:int num[]={1,2,3,4}
2)部分初始化
形式1:int num[4]={1,2};
没初始化的元素值为0.
形式2:int num[10]={[3]=8,[4]=123};
没初始化的元素值为0.
(2)先定义,后初始化
int num[4];
num[4]={12,3,4,5};
5、(1)如果数组没有被初始化,那么数组中到底有没有值?有是多少?
有值,垃圾值。
(2)如果数组部分初始化,那么数组中没有被初始化的元素有没有值?有是多少?
有值。
如果是int类型的数租,那么剩余元素的值为0.
如果是float类型的数组,那么剩余元素的值为0.000000
如果是char类型的数组,那么剩余元素的值的ascii码的值为0
特别强调:使用先定义后初始化的方式,如果部分元素被初始化了,系统不会对没有初始化的那部分元素赋值为0
6、遍历数组
7、存储方式
数组的首地址:数组的第一个元素首地址(第一个元素的第一个字节地址)。
先存入的元素处于低地址,后存入的与元素处于高地址。
数组名是一个常量,它存储的是数组的首地址。
8、长度计算方法
数组长度=数组占用的总字节数/数组元素占用的字节数
9、一维数组越界问题
数组越界即使没有报错,也是不安全的,因为数据有可能会丢失,这个空间不属于你。
10、案例:输入10个数字,并输出10个数字中最大的数
11、数组元素作为函数参数
12、数组作为函数参数
需要注意的是:
用数组名作为函数参数,传递的是地址
实参是数组名numbers,形参是nums
此时,numbers和nums在内存中代表了同一块内存空间
13、数组名作为函数参数需要注意的点
1、形参数组的类型和长度要和实参一致,如果类型不一致,会造成错误。
2、实参的类型和形参的类型不匹配
3、形参的数组的长度和实参的长度可以不一致,随不会报错,单运行的结果和实际不相符
4、形参数组的数组长度可以不写
5、数组作为实参传递到被调函数中,被调函数的形参数组的长度为8.因为传递的是地址,所有类型的地址都占8个字节
相关文章推荐
- C++ 命名空间
- C++对象模型——Inline Functions(第四章)
- C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)
- C++对象模型——指向Member Function的指针 (Pointer-to-Member Functions)(第四章)
- [LeetCode] Flatten Binary Tree to Linked List
- vc++6对windows SEH扩展分析
- C++对象模型——函数的效能(第四章)
- C++之 继承后的访问控制
- C++:C++的两种多态形式
- C/C++产生随机数
- C语言str函数系列总结
- Leetcode -- Longest Common Prefix
- C++11中变量初始化方法汇总
- C++primer【笔记】 顺序容器
- POCO C++库学习和分析——任务
- 黑马程序员——C语言笔记之函数
- C语言宏定义中的#,##,#@及\符号的作用
- c++中四种类型转换
- [LeetCode] Convert Sorted List to Binary Search Tree
- C++Builder6程序设计教程,用TADOConnection,TADOQuery,TADOTable,TDataSource,TDBGrid相关控件实现对数据库的操作