iOS开发 — C语言基础6(数组)

iOS开发 — C语言基础6(数组)

C语言数组

如出一辙、数组的定义

就此来囤一组数的组织数据类型

特征:只能存放一种档次的数目,如所有是int型或者全体凡是char型,数组里的数额变成元素。

为吃大家又好地读书与晓往往组,我们事先来认一下内存中的”地址”。

二、地址

1.电脑中的内存是以字节为单位之蕴藏空间。内存的各国一个字节都有一个唯一的号子,这个号码就称为地址。凡存放在内存中的次第及数据都发生一个地点,也就是说,一个函数也发出谈得来之内存地址。

2.当定义一个变量时,系统就分配一个饱含唯一地址之存储单元来储存这个变量。比如:

char a = ‘A’; // A的ASCII值为65

int b = 66;

以16bit编译器环境下,系统为a、b分别分配1单字节、2只字节的存储单元。变量存储单元的率先独字节的地方便是拖欠变量的地点。

得看到,变量a的地方是ffc3;变量b的地点是ffc1。内存中储存的且是2进制数据。

3.于调试过程中,我们用打印的点子查看变量的地点:

int c = 10;

// 以16进制形式出口地址

printf(“16进制:%x\n”, &c);

// 以10进制形式出口地址

printf(“10进制:%d”, &c);

出口结果:

老三、一维数组

1.概念的样式吗:类型  数组名[素个数]

int a[5];

* []只能在数组名的后面,下面的且是荒唐写法:

int[5] a; // 错误

int[] b; // 错误

*
[]里的个数必须是一个固定值,可以是常量(比如6、8)、常量表达式(比如3+4、5*7)。绝对不克采取变量或者变量表达式来表示元素个数,大多数情景下非使看看略元素个数(当数组作为函数的形参和数组初始化时除了)

下面的且是不易写法:

int  a[5];  // 整型常量

int  b[‘A’];  // 字符常量,其实就是65

int  c[3*4];  // 整型常量表达式

下面的都是错写法:

int a[]; // 没有点名元素个数,错误

int i = 9;

int a[i]; // 用变量做元素个数,错误

2.一维数组的积存

概念数组时,系统以按数组类型及个数分配一段连接的存储空间来存储数组元素,如int
a[3]霸占了连的6字节囤积空间(在16位编译器环境下,一个int类型占用2只字节)。要专注的是,数组名代表正在全体数组的地点,也就是是反复组的前奏地址。

顾:其实a不算是变量,是只常量,它代表在频繁组的地址。上图把a放到变量一牢是为着便于大家知道数组结构。

数组a的地方是ffc1,a[0]的地点是ffc1,a[1]的地址是ffc3,a[2]的地点是ffc5。因此a
== &a[0],即首先只因素的地点便是不折不扣数组的地址。

3.一维数组的初始化

* 初始化的貌似式是:类型  数组名[素个数] = {元素1, 元素2, …};

int a[2] = {8, 10};

其实一定给:

int a[2];

a[0] = 8;

a[1] = 10;

在意的凡:C语言中编译器是免会见对数组下标越界进行检讨的,所以自己看数组元素时若小心

* 元素值列表可以是数组所有因素的初值,也堪是前方有素的初值

int a[4] = {2, 5};

当数组为整型时,初始化未确定初值的元素,默认为0,所以地方的a[2]、a[3]都为0

* 当对整个屡组元素都与初值经常,可以简单元素个数

int a[] = {2, 5, 7};

说明数组a的因素个数是3

*
数组初始化时的赋值方式只能用来数组的概念,定义之后只能一个要素一个要素地赋值

脚的写法是荒唐的:

1 int a[3];

2 a[3] = {1, 2, 3}; // 错误

3 a = {1, 2, 3}; // 错误

实际上为什么是荒谬的写法呢?我们好简单分析一下。

1>
第2行的a[3]意味着正在看数组的第4独要素,首先这里都是数组下标越界了;就算没越界,给a[3]赋值时为相应授予一个int类型的平头,不该是{}。

2>
第3实行的a是多次组名,代表正在累组的地方,它是只常量!给常量赋值,那必然错了!

4.一维数组与函数参数

如忘记了实参和形参的意思,可以回看下《iOS开发 —
C语言基础3(函数)》这篇稿子

*
一维数组的素作为函数实参,与同类型的简练变量作为实参一样,是仅仅为的值传递,即数组元素的价值传被形参,形参的改不影响实参

// b是test函数的形参(形式参数)

void test(int b) {

b = 9;

}

int main()

{

int a[3];

a[0] = 10;

printf(“函数调用前之a[0]:%d\n”, a[0]);

test(a[0]); // a[0]大凡test函数的实参(实际参数)

printf(“函数调用后底a[0]:%d”, a[0]);

return 0;

}

输出结果:

*
大家还知晓,数组名代表正一切数组的地方,如果同样维数组的名字作函数实参,传递的凡整整数组,即形参数组和实参数组完全相同,是存于一如既往存储空间的与一个数组。这样形参数组改时,实参数组也以叫涂改了。形参数组的因素个数可以省略。

// b是test函数的形参(形式参数)

void test(int b[]) { // 也堪写int b[3]

b[0] = 9;

}

int main()

{

int a[3];

a[0] = 10;

printf(“函数调用前之a[0]:%d\n”, a[0]);

test(a); // a是test函数的实参(实际参数)

printf(“函数调用后底a[0]:%d”, a[0]);

return 0;

}

输出结果:

季、二维数组

1.二维数组的定义

概念形式:类型  数组名[行数][列数]

int a[2][3]; // 共2行3列,6个元素

2.二维数组的积存

*
C语言把二维数组当作是均等维数组的集聚,即二维数组是一个特有之同维数组:它的因素是同一维数组。例如int
a[2][3]足用作由同维数组a[0]及一维数组a[1]结,这有限只一维数组都蕴含了3独int类型的素

*
二维数组的存放顺序是按行存放的,先寄存第一履行之素,再存第2实施的因素。例如int
a[2][3]的寄放顺序是:a[0][0] → a[0][1] → a[0][2] →
a[1][0] → a[1][1] → a[1][2]

* 再来看看当内存中的储存情况,例如int a[2][2]

(注意:a[0]、a[1]呢是一再组,是同等维数组,而且a[0]、a[1]纵然是累累组名,因此a[0]、a[1]即代表在此一维数组的地址)

1> 数组a的地点是ffc1,数组a[0]的地址为是ffc1,即a = a[0];

2>
元素a[0][0]的地点是ffc1,所以数组a[0]的地方及元素a[0][0]的地点一样,即a[0]
= &a[0][0];

3> 最终可以得出结论:a = a[0] =
&a[0][0],以此类推,可以得出a[1] = &a[1][0]

3.二维数组的初始化

* 按行进行初始化

int a[2][3] = { {2, 2, 3}, {3, 4, 5} };

* 按存储顺序进行初始化(先存放第1实行,再存第2推行)

int a[2][3] = {2, 2, 3, 3, 4, 5};

* 对部分因素进行初始化

int a[2][3] = { {2}, {3, 4} };

int b[3][3] = { { }, { , , 2}, {1, 2, 3}};

* 如果单初始化了有的元素,可以大概行数,但是不可以略列数

int a[][3] = {1, 2, 3, 4, 5, 6};

int a[][3] = {{1, 2, 3}, {3, 5}, {}};

稍加人想必想不晓得,为什么可以概括行数,但不得以大概列数。也有人或许会见问,可免得以但指定行数,但是简单列数?

实质上这题目很粗略,如果我们如此写:

int a[2][] = {1, 2, 3, 4, 5, 6}; // 错误写法

大家都懂得,二维数组会先寄存第1实践之素,由于未确定列数,也不怕是勿确定第1执而存放多少只元素,所以这边见面有非常多种景,可能1、2是属第1推行的,也恐怕1、2、3、4凡率先执行的,甚至1、2、3、4、5、6全部都是属于第1实践的

其三维乃至更多维的数组就不再提及了,大家以此类推。