a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 105|回复: 0

[C语言] 关于C语言中数组和指针的互操作

[复制链接]
发表于 2012-7-31 21:48:08 | 显示全部楼层 |阅读模式
C是一种怀旧的语言,因为它的历史很久远,然而自从各种面向对象的编程语言的相续出现让它的影响力日减。当然了,这是无可非议的,但是C的高效性是其他语言无妨比拟的,所以我们有必要把握其中的精华与奥妙,也就有必要知道其中的基本的数据结构的比如数组,稍微有点深度的堆栈、列表、结构体等的操作和实现。指针也是C语言中的一个很优秀灵活的结构,对它的了解也是必不可少的。   6 e; j- r/ g* Z. Z7 m
  我们一般都认为数组是一维的数据存储结构,因为二位数组或者说矩阵都可以看作是多个一维数组的组合结构,定义在其上的数据存储访问方式是一样的。所以一维数组是其中最基础的最重要的部分,只有理解了此类数据结构的本质才能触类旁通了。   $ p6 Y: ]: v, @+ F# d9 v; s7 S% }
  数组(array)是若干同类变量的聚合,允许通过统一的名字饮用其中的变量。所以数组也就是一个同一类型的数据的有限集合。可以通过下表来访问数组中的某一/些数组元素。在C语言中数组都由连续的内存区域构成(有时候,不一定是这样),最低地址对应首元素,数组的下标是从0开始的,所以首元素也就是数组下标为0的元素,最高的地址对应最末的元素,即第N-1个元素(如果我们定义的数组为N元)。   
$ ?# T* Z& Y6 P, X! ^5 b+ S  数组的定义方式:   1 \" Y) ]( a9 Z% ]
  在C语言中允许在声明数组的时候同时对其进行初始化,也可以把声明和定义放在不同的位置,初始化的一般的类似于如下的表达式:   5 V0 e( o4 m8 s9 N8 R) j$ r
     
% R/ [  d' g7 u" ~  type_specifier array_name[size1]...[sizeN] = {value_list};   - A. ]" Q# ]' ^0 ^1 @9 M
  其中vlaue_list是由逗号(,)分隔的常量表,常量表必须和type_specifier兼容。最后由分号与下一个语句分隔。由此可见一维数组的定义方式为:   
0 b; o4 o8 O) Z! G! P+ _     " n( N  H$ l0 e0 e7 A
  type_specifier array_name[size] = {value_list};   
0 X& [8 |0 ~5 T0 C3 ?+ C  如下:char hello[12] = {’H’,’e’,’l’,’l’,’o’,’,’,’ ’,’w’,’o’,’r’,’l’,’d’,’’};   9 R( u$ M" G7 S7 \* D+ ]. F
  注意:字符数组是一"’’"收尾的,这是C标准的一部分。因为在操作字符数组的时候是以’’作为结束判断的标志。当然了,如果你定义的是一个字符串那就不用加这个’’了。因为有机制帮助你自动添加。上面的例子的串的生命方式为:string hello = "Hello, world";(当然了,具体的实现中你必须把"string.h"头文件加入到你的文件中),或者你也可以这样来声明:   
. @+ d# r3 Y3 S- M( z     
0 K5 j) x# a0 V& [$ d( d4 V- z8 S  char *hello = "Hello, world";或者char hello[] = "Hello, world"; 切换为字符指针数组,其效果是一样的);数槌跏蓟氖焙蚧箍?nbsp;以不标明最大小,即   * c. z. G8 K/ X6 u/ w
  char hello[] = {’H’,’e’,’l’,’l’,’o’,’,’,’ ’,’w’,’o’,’r’,’l’,’d’,’’};,这时候编译器会根据后边的赋值情况为数组分配合适的内存空间,这个你不用担忧,除非机器正处于内存缺状态。
5 V" T: a  @/ V( M数组元素的访问:   ; z, P% J4 ^, j' O
  可以利用循环结构来挨个访问数组的元素,比如:   
8 X- ~- C( h" C     
7 _- |% ^4 z% @* i7 r7 l+ T. x  [...]   
5 _6 |5 r3 F  Z  int i;   * ?; l) X( {& Z* u0 a
  char hello[12] = {’H’,’e’,’l’,’l’,’o’,’,’,’ ’,’w’,’o’,’r’,’l’,’d’,’’};   & O4 v. g2 h' p: h8 [$ p
  [...]   
+ f8 `: I" j- G2 D  for(i = 0; i < 12; i++){   
! i+ @6 [; D3 ]* w/ t     ( O. i7 S$ B# n) x. u, s" X
  printf("%c",hello);   9 J) b) o# V. r- T+ K) Z  ~( D0 N; O
  }   6 i+ b$ M, Q+ B) A8 b& t# r3 `
  printf(" ");   
' }% l0 C) V. ?3 V# f2 ]# }  [...]   
7 M) D4 f  w; w$ z1 n  其中有一点必须注意了,那就是i的值不能取到12,因为我们的下标识从0开始的,即hello[0]是第一个元素,数组的下界,而hello[12]是第一个空元素,数组的上界。其实,数组元素的个数等于定义时的下标,也等于数组的上界(12)减去下界(0)得到的数值,还等于上界地址减去下界地址模sizeof(tyep_specifier)的值(假设数组空间是连续分布的,如果不是这样那么这种方法也就不成立了)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-22 13:24 , Processed in 0.201889 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表