c语言数组

原创 2018年04月15日 12:39:16

一维数组

1.数组名

Int arr[10]

变量arr称为数组,它是一些值的集合。下标和数组一起使用,用于标识改集合中某个特定的值。例如:arr[0]表示数组arr的第一个值,arr[5]表示数组arr的第四个值。每个特定的值都是一个标量,可以用于任何可以使用标量数据的上下文环境中。

arr[5]表示一个整型。在c中,几乎所有的使用数组名的表达式中,数组名的值是一个指针常量,也就是数组第1个元素的地址。示例数组名类型是“指向int的常量指针”。

数组具有完全不同于指针的特性:数组具有确定的元素,而指针只是一个标量值。编译器用数组名来记住这些属性,只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量(不是指针变量)。指针常量所指向的是内存中数组的起始位置,如果修改这个指针常量,唯一可行操作就是把整个数组移动到内存的其他位置。但是,在程序完成连接后,内存中数组的位置是固定的。因此,数组名的值是一个指针常量。

只有在两种情况下,数组名并不用指针常量来表示:

①当数组名作为sizeof操作符sizeof返回整个数组的长度。

②当数组名作为单目操作符&,取一个数组名的地址所产生的是一个指向数组的指针,而不是指向某个指针常量值的指针。

2.下标引用

arr[0]表示引用数组中的第一个元素

arr[3]*(arr+3)这两个表达式是等同的,都是访问数组第四个元素,或者取得那里的值(右值),或者把一个新值存储于该处(左值)。c中,除了优先级之外,下标引用和简介访问完全相同。

例:

Int array[10];

Int *ap=array+2;

Ap    array+2也是&array+2

*ap   是间接访问跟随指针访问它所指向的位置,array[2]

ap[0]  errap不是一个数组。

ap+6  array[2]向后移动6个整数位置的元素,与它对等的元素是array+8&array[8]

*ap+6 是首先执行间接访问,间接访问的值再与6相加,array[2]+6

*(ap+6)array[8]

ap[6]  array[8]

&ap   表达式合法,因为此时没有对等的涉及array的表达式,所以无法预测编译器会把ap放到相对于array的什么位置。

ap[-1]  ap指向第三个元素,所以使用偏移量-1得到前一个元素,也就是array[1]

ap[9]  对应array[11],但数组只有10个元素。这个下标表达式的结果是一个指针表达式,但他所指向的位置越过了数组的右边界。根据标准,这个表达式是非法的。但是少有编译器能检测出这个错误,所以程序能够顺利进行。在绝大多数机器上,它将访问恰好存储于数组最后一个元素后面第2个位置的值

2[array] 把它转换成对等的间接访问表达式*2+array))与array[2]是相等的。

指针有时候比下标更有效率。

3.初始化

不完整的初始化

int arr[5] = {1,2,3,4,5,6};  错误,无法把6个整型值装入5个整形变量中

int arr[5] = {1,2,3,4} ; 合法,最后一个元素初始化为0

int arr[5] = {1,5};  只允许省略最后几个初始值

自动计算数组长度

int arr[] = {1,2,3}声明中并未给出数组的长度,编译器自动把数组长度设置刚好容纳所有初级值的长度。

字符数组的初始化

char message[] = {h,e};

char message[] = he;

二维数组

int arr [3][4]   //表示三行四列的数组或者四列三行,

1.存储顺序

 

 

 

 

 

 

 

 

 

 

 

 

实线方框表示第一维的3个元素,虚线用于划分第二位维的4个元素(一行一行存储,看成一维数组)

上面每个元素的下标值分别为:

0,1  0,1  0,2  0,3

1,0  1,1  1,2  1,3  

2,0  2,1  2,2  2,3

c中,多维数组的存储顺序按照最右边的下标率先变化的原则,称为行主序。

2.数组名

int arr[3][4]

Arr这个名字的值是一个指向它第一个元素的指针,所以arr是一个指向一个包含4个整型的数组的指针(指向数组的指针)

3.下标

Arr指向第一行,

arr+1指向第二行,

*arr+1)指向第二行第一个元素,arr+1指向第二行,*间接访问第一个元素,

**arr+1+3)指向第二行第四个元素,第二个*访问第二行第一个元素,第二个*访问右移三个整型长度的元素,*arr[1]+3,arr[1][3]

4.指向数组的指针

Int matrmix[3][10];

Int (*p)[10] = matrmix;

p指向matrmix的第一行

Int *pi = matrmix[0][0];//指向matrmix的第一个元素

Int *pi = matrmix[0];//指向matrmix的第一个元素

5.初始化

二维数组初始化

Int matrmix [3][5] = {

{00,01,02,03,04},

{10,11,12,13,14},

{20,21,22,23,24}

};

三维数组初始化

Int  three_dim[2][3][5] = {

{

{000, 001, 002, 003, 004 },

{010, 011, 012, 013, 014},

{020, 021, 022, 023, 024}

},

{

{100, 101, 102, 103, 104 },

{110, 111, 112, 113, 114},

{120, 121, 122, 123, 124}

}

};

四维数组初始化

6.数组长度自动计算

在多维数组中,只有第一维才能根据初始化列表缺省的提供。

7.指针数组

C语言程序设计数组C语言程序设计数组C语言程序设计数组C语言程序设计数组C语言程序设计数组C语言程序设计数组C语言程序设计数组

  • 2010年04月15日 18:22
  • 249KB
  • 下载

C语言数组练编程习题

  • 2011年10月25日 13:14
  • 14KB
  • 下载

C语言学习之数组

数组是同种类型元素的集合。 一、 一维数组 1. 一维数组定义 int a[10]; 这样我们便定义了一个数组a,它分配10个int类型空间。 2. 数组的初始化 我们可以在定义一...
  • mcgrady_tracy
  • mcgrady_tracy
  • 2012-05-03 23:22:24
  • 13654

c语言数组练习题及答案

  • 2009年12月16日 01:34
  • 4KB
  • 下载

一分钟了解“c语言如何建立数组”

unsigned short A[35]; unsigned char B[320*256*2]; unsigned short C[320*256];
  • yes1989yes
  • yes1989yes
  • 2017-07-20 22:46:45
  • 545

C语言数组知识点总结

数组:就是只能存放一种数据类型,比如int类型的数组、float类型的数组,里面存放的数据称为“元素” 数组的定义: 首先声明数组的类型,然后声明数组元素的个数(也就是需要多少存储空间) ...
  • wutengwei007
  • wutengwei007
  • 2015-03-12 18:36:10
  • 17416

C语言数组必须要懂得三个程序

对于大多数学习编程的小白来说,选择C语言,作为自己编程入门语言的,占了绝大数。一来c语言不像汇编那么晦涩难懂(因人而异,仅仅是个人看法),比较贴近自然语言,二来大多数科班出来的,在学校期间学到的最基础...
  • lzj18395598398
  • lzj18395598398
  • 2017-07-27 12:07:41
  • 1211

c语言数组、数组相关的计算

数组 1.数组的创建: 元素类型 数组名 [常量或者常量表达式]  如:int arr1[10]; 注:即使是被const修饰的变量也不能作为[]中的内容,它本质上依然属于变量,只是具有常量...
  • lyl194458
  • lyl194458
  • 2016-11-18 08:30:41
  • 1559

c语言数组详解

数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组...
  • ad_ad_ad
  • ad_ad_ad
  • 2007-04-24 16:37:00
  • 12124

c语言 --关于数组与指针的一些基本运算

一.sizeof()的有关运算1知识:当数组名a单独放在sizeof()内部(即 sizeof(a))时,a表示整个数组;当数组名a单独放在&后面时(即&a),a表示整...
  • xu1105775448
  • xu1105775448
  • 2017-04-20 20:32:16
  • 1666
收藏助手
不良信息举报
您举报文章:c语言数组
举报原因:
原因补充:

(最多只允许输入30个字)