c语言数组

一维数组

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]  是err,ap不是一个数组。

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.指针数组

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值