您的位置: 首页 计算机类> 水平考试> 复习资料> 程序员资料
计算机软件水平考试程序员复习资料 全国计算机水平考试复习资料
公务员考试辅导课程

高级语言程序设计知识点五

发布时间:06-20

来 源:

页 数:4页

上一篇:高级语言程序设计知识点二

下一篇:高级语言程序设计知识点四



    3.指向字符串的指针变目
        通常所说的字符串指针就是指向字符率某字符的字符指针。因字符率存储于字符数组中,所以字符串指针也就是指向数组元素的指针。
      为程序中引入的字符串常量提供存储空间有两种方法。一是把字符率常量存放在一个字符数组中。例如,
    char s[]="I am a string.";
数组s共有15个元素,其中 s[14] 为'\0' 字符。对于这种情况,编译程序根据字符串常量所需的字节数为字符数组分配存储,并把字符串复写到数组中,即对数组初始化。另一种方法是由编译系统将字符串常量与程序中出现的其它常量一起存放在常量存储区中。程序为了能访问存于常量存储区中的字符串常量,可用一个字符指针指向它的第一个字符。当字符串常量出现在表达式中时,系统将字符率常量放入常量存储区,而把表达式转换成字符指针,指向该字符串常量的第一个字符。因此,可在定义字符指针变量时给它初始化指向某字符串常量,或用字符申常量给字符指针变量赋值,这两种方法都使字符指针指向字符串常量的第一个字符。例如,
     char *cp1,*cp2="I am a string";/*定义字符指针变量,并赋初值*/
     cp1="Another string";/* 先定义字符指针变量,然后按需要赋初值*/
      上述代码使字符指针变量cp2指向字符率常量"I am a string"的第一个字符I,使cpl指向字符串常量"Another string"的第一个字符 A。
    4.指向二维数组中的某个一维数组的指针变量
        如有一个二维数组,且指针变量所指的是二维数组中的一整行,则指针变量另有一些很有意义的性质。设有二维数组为
int a[3][4]={{1,2,3,4},{5,6,7,8 },{ 9,10,11,12 }};
这里,数组a有3行4列。按行来看数组a,数组a有三个元素,分别为a[0],a[1],a[2]。它们又分别是一个一维数组,各有4个元素。例如,a[0]所代表的一维数组为
   a[0][0] 、a[0][l] 、a[0]p[2], a[0][3]。
一维数组名表达式的值是数组首元素(下标为0)的地址,二维数组名a表达式是a的首行a[0]的地址。一般地,a+i可以看作二维数组a的第i+1行的首地址。
        因二维数组a能用a[0].a[1]、a[2] 分别表示它的各行,所以a[0]能表示用a[0]标记的 a的第一行的首元素 a[0][0] 的地址;a[1] 能表示用 a[l] 标记的 a的第二行的首元素 a[l][0] 的地址。一般地,a[i]能表示用 a[i]标记的a的第i+1行的首元素a[i][0]的地址。由于数组的开始地址与数组首元素的地址相同,这样,a+i与a[i]应有相同的值,但它们的意义不同,a+i表示用a[i]标记的a的第i+1行的首地址,a[i]表示用a[i]标记的a的第i+l行的首元素a[i][0]的地址。另外,因a[i]可写成*(a+i),所以a+i与*(a+i)也有不同意义,而值相等。a[i]或*(a+i) 表示二维数组a的元素a[i][0]的地址,即&a[i][0]。根据地址运算规则,a[i]+j即代表数组a的元素a[i][j]的地址,即&a[i][j]。因a[i]与*(a+i)等价,所以*(a+i) +j也与&a[i][j]等价。
由二维数组元素a[i][j]的地址有多种表示形式,数组元素a[i][j]也有以下三种等价表示形式:*(a[i]+j)、*(*(a+i)+j)、(*(a+i))[i]。特别是对于a[0][0],它的等价表示形式有*a[0]和**a。数组元素a[i][j]的地址也有三种等价的表示形式:a[i]+j、*(a+i)+j、&a[i][j] 。
      也可以定义指向二维数组中某行由若干个元素所组成的一维数组的指针变量。如代码
    int (*p)[4];
定义指针变量p能指向一个由四个int型元素组成的数组。指针变量p不同于前面介绍的指向整型变量的指针。在那里,指向整型变量的指针变量指向整型数组的某个元素时,指针增减1运算,表示指针指向数组的下一个或前一个元素。在这里,p是一个指向由四个整型元素组成的数组,对p作增减1运算,就表示向前进或向后退四个整型元素。用例子说明指向由若干个元素所组成的数组指针的用法,如有变量定义
    int a[3][4],(*p)[4] ;
则赋值p=a+l,使p指向二维数组a的第二行,表达式p+l的值为指向二维数组a的第三行。同二维数组元素的地址计算规则相对应,若 P=a+1,则*p+j指向a[l][j];*(p+i) +j,或者p[i]则指向数组a的元素a[i+l][j]。二维数组名和指向数组的指针与数组元素位置之间的关系如图5.2所示。

 

   5.3  指针数组和多级指针

    1.指针数组
   当数组元素类型为某种指针类型时,该数组就是指针数组。指针数组的定义形式为
     类型说明符 *数组名[常量表达式] ;
例如,
      int *p[10] ;
定义指针数组p的每个元素都是能指向int型数据的指针变量,p有10个元素,它们是p[0] 、p[l]、…、p[9]。和一般的数组定义一样,数组名p也可作为p[0]的地址。
    在指针数组的定义形式中,由于“[ ]”比“*”的优先级高,使数组名先与“[]”结合,形成数组的定义,然后再与数组名之前的“*”结合,表示此数组的元素是指针类型的。注意,在“*”与数组名之外不能加上圆括号,否则变成指向数组的指针变量。
    引人指针数组的主要目的是便于统一管理同类的指针。如利用指针数组能实现对一组独立的变量以数组的形式对它们作统一处理。如有以下定义:
   in a,b,c,d,e,f;
   int *apt[]={&a,&b,&c,&d,&e,&f};
下面的循环语句能顺序访问独立的变量a、b 、c、d、e、f; 
    for( k=0; k<6;k++)
    printf("%d\t",*apt[k]);/*其中*apt[k]可写成**(apt+k)*/
    当指针数组的元素分别指向二维数组各行首元素时,也可用指针数组引用二维数组的元素。以下代码说明指针数组引用二维数组元素的方法。设有以下代码:
    int a[10][20] ,i;
    int *b[10];
   for(1=0;i<10;i++)/*b[i]指向数组元素a[i][0]*/
   b[i]=&a[i][0] ;
则表达式a[i][j]与表达式b[i][j]引用同一个元素,即从指针数组方向来看,因b[i]指向元素a[i][0],*(b[i]+j)或 b[i][j]引用元素a[i][j]。
另外,当指针数组的元素指向不同的一维数组的元素时,也可通过指针数组,如同二维数组那样引用各一维数组的元素。如以下代码所示:
   char w0[ ]="Sunday",w1[ ]="Monday",w2[ ]="Tuesday",
   w3[ ]="Wednesday", w4[ ]="Thursday", w5[ ]="Friday",
  w6[ ]="saturday";
  char *wName[ ]={w0,wl,w2,w3,w4,w5,w6 };
则语句for(i=0;i<=6;i++)
   printf("%s\n", wName[i]);
输出星期的英文名称。代码wName[2][4]引用字符w2[4],其值为'd'。
   以下例子把一维数组分割成不等长的段,通过指针数组,把一维数组当作二维数组来处理。

 # include<stdio.h> 
  # define N 8
   int p[N*(N+l)/2],i,j,*pt[N] ;
   void main()
   {  for(pt[0]=p, i=l;i<N; i++)
   pt[i]=pt[i-1]+i;
   for(i=0; i<N;i++) {
   pt[i][0]=pt[i][i]=l;
   for(j=l;j<i; j++)
   pt[i][j]=pt[i-1][j-1]+pt[i-1][j];
   }
   for(i=0;i< N; i++) {
   printf("%*c",40-2*i,'');
   for(j=0; j<=i ;j++)
   printf("%4d", pt[i][j]) ;
   printf("\n");
   }
   }
程序产生如下形式的二项式系数三角形:
                 1
               1   1
             1   2   1
           1   3   3   1
         1   4   6   4   1
       1   5   10   1O  5  1 
     1   6   15  20  15   6  1
   1   7   21  35  35  21  7   1 




Google
 

     

考试信息

热点

课程

更新

©2005-2006 100ksw.com 版权所有 皖ICP备06013378号