您的位置: 网站首页 > 程序开发 > C语言程序设计案例教程 > 第八章 指针 > 【8.2 指针与数组案例】

8.2 指针与数组案例

 

8.2  指针与数组案例

案例8.3  利用指针输出一维数组中的元素

【项目任务】

利用指针来输出一个一维数组中的所有元素。

【设计思路】

在主函数中,定义一个指针p,使其指向数组a的首地址,利用for循环输出数据中的元素。

【程序代码】

#include <stdio.h>

main()

{

    int a[5]={10,20,30,40,50};

    int *p;

    int i;

 

    p=a;                         /*等价于p=&a[0]*/

 

    for(i=0;i<5;i++)

       printf("%d ",*(p+i));     /*等价于p[i]*/

    printf("\n");

}

【运行结果】

10 20 30 40 50

【知识拓展】

数组元素存放在一片连续的存储空间上。所谓数组的指针也就是数组的首地址,数组元素的指针是各个数组元素的地址。

数组名,即数组的首地址,是一个地址常量。数组中第0个元素的地址可以表示成&a[0]&*(a+0)a+0a;,第i个元素的地址可以表示成&a[i]&*(a+i)a+i;,第i个元素的引用可以表示成a[i]*(a+i)

使一个指针指向数组的首地址,通过指针运算就可以找到数组中的任意一个元素。指针的算术运算有++--+-等,其中p++表示指针向后移动一个单位,注意不是移动一个字节,移动的大小由指针的基类型决定。如一个指针变量指向一个整型变量(2个字节),那么指针变量加1表示指针向后移动2个字节。

以上程序也可以改写为:

#include <stdio.h>

main()

{

    int a[5]={10,20,30,40,50};

    int *p;

 

    for(p=a;p<a+5;p++)       /*该处的for循环也可以修改成:

for(p=a;p<a+5;)

    printf("%d ",*p++);*/

        printf("%d ",*p);

    printf("\n");

}

本案例中,指针的值没有改变,只是使p+i指向不同的数组元素,达到遍历数组的目的。而改写后的程序,则利用p++的算术运算改变了指针p的值,使其指向不同的数组元素。

案例8.4  利用指针输出二维数组中的元素

【项目任务】

利用指针来输出一个二维数组中的所有元素。

【设计思路】

在主函数中,定义一个行指针p,使其指向数组a的第一行,利用两层嵌套for循环输出数据中的所有元素。

【程序代码】

#include <stdio.h>

main()

{

    int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

    int (*p)[4];                     /*p为指向具有4个元素的一维数组的行指针*/

    int i,j;

 

    p=a;                             /*等价于p=&a[0]*/

 

    for(i=0;i<3;i++)

    {

       for(j=0;j<4;j++)

          printf("%-3d",*(*(p+i)+j));/*等价于p[i][j]*/

       printf("\n");

    }

}

【运行结果】

  1  2  3  4

  5  6  7  8

  9  1011 12

【知识拓展】

1p为指向具有4个元素的一维数组的行指针,具体含义是p所指向的实体的类型不是数组中的某一个元素,而是4个元素组成的一个整体。如整型数组a(一个整型变量占2个字节),p+1就表示移动一行(4个数组元素的大小单位,即8个字节)。如果p仅仅是指向数组中一个元素的指针,则p+1只表示移动一个元素的大小单位,即2个字节。

2.行指针指向二维数组的某一行,行指针加1,表示向后移动一行;相应的列指针指向二维数组的某一行、某一列中的一个数组元素,列指针加1,则表示向后移动一列。

·    p+i表示行指针,指向二维数组的第i行。

·    p[i]+j*(p+i)+j表示列指针,它指向第i行,第j列元素。

·    *(*(p+i)+j)*(p[i]+j)p[i][j]则表示a[i][j]元素的引用。

案例8.5  字符串字母的顺序输出

【项目任务】

利用指针输出一个字符串中的元素。

【设计思路】

定义一个字符指针,指向字符串的首地址,利用While循环遍历字符串。

【程序代码】

#include <stdio.h>

main()

{

    char str[]="Hello,world!\n";

    char *p;

 

    p=str;               /*p指向字符串的首地址*/

 

    while(*p)            /*等价于*p!=’\0’*/

    {

       printf("%c",*p);

       p++;

    }

}

【运行结果】

Hello,world!

【知识拓展】

1.字符串的结束标志为字符\0’,该字符的ASCII码值为0,所以遍历字符串的循环结束条件是*p*p !=0*p !=\0’

2while语句的循环体可以用语句printf("%c",*p++);替代。

3.本案例采用指针法,除此之外,还经常采用下标法处理类似的问题。

采用下标法处理本案例的程序代码如下:

#include <stdio.h>

main()

{

    char str[]="Hello,world!\n";

    int  i;

   

    for(i=0;str[i]!=’\0’;i++)        /*等价于str[i]*/

   printf("%c",str[i]);

}

案例8.6  将数组中的元素首尾逆置

【项目任务】

利用指针,使数组中的元素首尾逆置。

【设计思路】

定义一个首指针,指向数组的第一个元素;定义一个尾指针,指向数组的最后一个元素。在循环过程中,利用首、尾指针交换数组的首、尾元素的值;同时,首指针向后移动,尾指针向前移动,两指针会面,循环结束。

【程序代码】

#include <stdio.h>

main()

{

    int a[5]={10,20,30,40,50},temp;

    int *p,*q;

    int k;

 

    p=a;         /*首指针*/

    q=a+4;       /*尾指针*/

 

    while(p<q)

    {

        /*交换首、尾元素*/

        temp=*p; *p=*q; *q=temp;

        /*首指针向后移动,尾指针向前移动*/

        p++,q--;

    }

 

    for(k=0;k<5;k++)

        printf("%d ",a[k]); 

    printf("\n");

}

【运行结果】

50 40 30 20 10

【知识拓展】

交换数组中首、尾元素的值,除了可以采用指针法,也可以采用下标法,代码如下:

#include <stdio.h>

main()

{

    int a[5]={10,20,30,40,50},temp;

    int i,j,k;

    for(i=0,j=4;i<j;i++,j--)

    {

        temp=a[i];

        a[i]=a[j];

        a[j]=temp;

    }

 

    for(k=0;k<5;k++)

       printf("%d ",a[k]); 

    printf("\n");

}