四、数组
2015-07-19 12:17
232 查看
说数组这个概率前先介绍下地址,这样又助于对数组的理解。
一、地址:
在计算机中,内存是以字节为单位的存储空间。每个内存都有自己一个唯一的内存地址,在程序中任何数据都有自己的内存地址,一个变量,一个函数都有自己的内存地址。
每当定义一个变量时,系统就会自动为这个变量分配内存地址。
上面这段代码中就定义了两个变量 a ,b 并打印出他们的内存地址(&可以打印出内存地址),打印结果(10进制)如下:
![](https://img-blog.csdn.net/20150720135403373?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
可以看出一般两个连续定义的变量在内存地址中是连续的。
二、一维数组:
一维数组的定义:
[ ] 里面的元素个数必须是固定的值,可以是常量(5,6)或者常量表达式(2*3,4/2)。不能使用变量和变量表达式来表示元素的个数,大多数情况下的元素个数是不能省略的(数组作为函数形参,和初始化的情况下除外)。
一维数组的初始化:
上面的形式其实相当于
注意:元素的下标是从0开始的,在C语言的编译器中,是不会对元素的下标越界进行检查的,所以访问数组时要小心谨慎。
上面这样的数组初始化只赋值了前面两个元素,也就是说 a[2] a[3]没有对其赋值。
数组的初始化赋值是可以省略元素个数的,这样的数组初始化表示的元素个数是两个,分别是 a[0] a[1]
注意:当定义一个数组时没有初始化赋值,后面对数组进行赋值时只能一个一个的赋值,如:
一维数组与函数参数:
一维数组的元素作为函数实参,与同类型的简单变量作为实参一样,是单向的值传递,即数组元素的值传给形参,形参的改变不影响实参。
输出结果:
![](https://img-blog.csdn.net/20150720135511719?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
数组名代表着整个数组的地址,如果一维数组的名字作为函数实参,传递的是整个数组,即形参数组和实参数组完全等同,是存放在同一存储空间的同一个数组。这样形参数组修改时,实参数组也同时被修改了。形参数组的元素个数可以省略。
输出结果:
![](https://img-blog.csdn.net/20150720140939998?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
三、二维数组:
二维数组的定义:
二维数组的存储方式:
二维数组在地址中的存储方式是先按顺序存储第一行再存储第二行,如下:
二维数组的初始化:
按行进行初始化:
这里的初始化可以只进行部分元素的初始化,不需要初始化的元素可以省略,没有初始化的元素默认值为0。
按存储顺序进行初始化:
注意看上面的初始化元素是少一个的,是可以只初始化部分元素的,这里的第 a [2] [1]个元素没有进行初始化,没有进行初始化的元素默认值为0。
初始化的时候可以省略行数,但是不能省略列数,如下:
一、地址:
在计算机中,内存是以字节为单位的存储空间。每个内存都有自己一个唯一的内存地址,在程序中任何数据都有自己的内存地址,一个变量,一个函数都有自己的内存地址。
每当定义一个变量时,系统就会自动为这个变量分配内存地址。
int a,b; printf(“%d\n%d",&a,&b);
上面这段代码中就定义了两个变量 a ,b 并打印出他们的内存地址(&可以打印出内存地址),打印结果(10进制)如下:
可以看出一般两个连续定义的变量在内存地址中是连续的。
二、一维数组:
一维数组的定义:
数组类型 数组名 [元素个数] int a[5];
[ ] 里面的元素个数必须是固定的值,可以是常量(5,6)或者常量表达式(2*3,4/2)。不能使用变量和变量表达式来表示元素的个数,大多数情况下的元素个数是不能省略的(数组作为函数形参,和初始化的情况下除外)。
一维数组的初始化:
一维数组的初始化一般形式是这样的:类型 数组名 [元素个数] = {元素1,元素2.....}; int a [2] = {1,2};
上面的形式其实相当于
int a [2]; a [0] = 1; a [2] = 2;
注意:元素的下标是从0开始的,在C语言的编译器中,是不会对元素的下标越界进行检查的,所以访问数组时要小心谨慎。
int a [4] = {3,4};
上面这样的数组初始化只赋值了前面两个元素,也就是说 a[2] a[3]没有对其赋值。
int a[ ] = {4,6};
数组的初始化赋值是可以省略元素个数的,这样的数组初始化表示的元素个数是两个,分别是 a[0] a[1]
注意:当定义一个数组时没有初始化赋值,后面对数组进行赋值时只能一个一个的赋值,如:
int a [5]; a [0] = 6; a [1] = 2; a [2] = 5; a [3] = 6; a [4] = 8;
一维数组与函数参数:
一维数组的元素作为函数实参,与同类型的简单变量作为实参一样,是单向的值传递,即数组元素的值传给形参,形参的改变不影响实参。
// b是test函数的形参(形式参数) #include <stdio.h> void test(int b) { b = 9; } int main(int argc, const char * argv[]) { int a[3]; a[0] = 10; printf("调用函数前的值:%d\n",a[0]); test(a[0]); printf("调用函数后的值:%d",a[0]); return 0; }
输出结果:
数组名代表着整个数组的地址,如果一维数组的名字作为函数实参,传递的是整个数组,即形参数组和实参数组完全等同,是存放在同一存储空间的同一个数组。这样形参数组修改时,实参数组也同时被修改了。形参数组的元素个数可以省略。
#include <stdio.h> // b是test函数的形参(形式参数) void test(int b[]) { b[0] = 9; } int main(int argc, const char * argv[]) { int a[3]; a[0] = 10; printf("调用函数前的值:%d\n",a[0]); // a是test函数的实参(实际参数) test(a); printf("调用函数后的值:%d",a[0]); return 0; }
输出结果:
三、二维数组:
二维数组的定义:
数组类型 数组名 [行数] [列数] int [3] [2]; // 3行2列 一共有6个元素
二维数组的存储方式:
二维数组在地址中的存储方式是先按顺序存储第一行再存储第二行,如下:
a [0] [0] a [0] [1] a [1] [0] a [1] [1] a [2] [0] a [2] [1]
二维数组的初始化:
按行进行初始化:
int a [3] [2] = {{2,1},{3,4},{2,4}}; int a [3] [2] = {{2},{},{2,4}};
这里的初始化可以只进行部分元素的初始化,不需要初始化的元素可以省略,没有初始化的元素默认值为0。
按存储顺序进行初始化:
int a [3] [2] = {2,4,5,1,4};
注意看上面的初始化元素是少一个的,是可以只初始化部分元素的,这里的第 a [2] [1]个元素没有进行初始化,没有进行初始化的元素默认值为0。
初始化的时候可以省略行数,但是不能省略列数,如下:
int a[] [2] = {{2,2}{3,4}{4,3}}; int a[] [2] = {1,42,4,2,3,4};
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#动态调整数组大小的方法
- Lua和C语言的交互详解
- 详解Lua中的数组概念知识
- Perl中的列表和数组学习笔记
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)
- C#中数组初始化与数组元素复制的方法
- C#交错数组用法实例
- PowerShell数组的一些操作技巧
- C#通过yield实现数组全排列的方法
- Ruby简明教程之数组和Hash介绍