zoukankan      html  css  js  c++  java
  • C言语教程第六章:指针(6)


      指针数组分析的一样平凡体式格局为: 类型分析符*数组名[数组长度]
      个中类型分析符为指针值所指向的变量的类型。比方: int *pa[3] 默示pa是一个指针数组,它有三个数组元素, 每个元素值都是一个指针,指向整型变量。平常可用一个指针数组来指向一个二维数组。 指针数组中的每个元素被付与二维数组每一行的首所在, 因此也可了解为指向一个一维数组。图6—6默示了这种干系。
    int a[3][3]={1,2,3,4,5,6,7,8,9};
    int *pa[3]={a[0],a[1],a[2]};
    int *p=a[0];
    main(){
    int i;
    for(i=0;i<3;i )
    printf("%d,%d,%d\n",a[i][2-i],*a[i],*(*(a i) i));
    for(i=0;i<3;i )
    printf("%d,%d,%d\n",*pa[i],p[i],*(p i));
    }
      本例步调中,pa是一个指针数组,三个元素分辨指向二维数组a的各行。然后用轮回语句输入指定的数组元素。个中*a[i]默示i行0列元素值;*(*(a i) i)默示i行i列的元素值;*pa[i]默示i行0列元素值;由于p与a[0]相反,故p[i]默示0行i列的值;*(p i)默示0行i列的值。读者可详尽了解元素值的各种分歧的默示体式格局。 应该注重指针数组和二维数组指针变量的区别。 这两者固然都可用来默示二维数组,但是其默示体式格局和意义是分歧的。

      二维数组指针变量是单个的变量,其一样平凡体式格局中"(*指针变量名)"单方的括号不可少。而指针数组类型默示的是多个指针( 一组有序指针)在一样平凡体式格局中"*指针数组名"单方不克不及有括号。比方: int (*p)[3];默示一个指向二维数组的指针变量。该二维数组的列数为3或剖析为一维数组的长度为3。 int *p[3] 默示p是一个指针数组,有三个下标变量p[0],p[1],p[2]均为指针变量。

      指针数组也常用来默示一组字符串, 这时指针数组的每个元素被付与一个字符串的首所在。 指向字符串的指针数组的初始化更为简略。比方在例6.20中即回收指针数组来默示一组字符串。 其初始化赋值为:
    char *name[]={"Illagal day",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday",
    "Sunday"};
      完成这个初始化赋值之后,name[0]即指向字符串"Illegal day",name[1]指?quot;Monday"......。

      指针数组也可以用作函数参数。在本例主函数中,界说了一个指针数组name,并对name 作了初始化赋值。其每个元素都指向一个字符串。然后又以name 作为实参调用指针型函数day name,在调用时把数组名 name 付与形参变量name,输入的整数i作为第二个实参付与形参n。在day name函数中界说了两个指针变量pp1和pp2,pp1被付与name[0]的值(即*name),pp2被付与name[n]的值即*(name n)。由条件表达式决意前去pp1或pp2指针给主函数中的指针变量ps。最初输入i和ps的值。

    指针数组作指针型函数的参数
    main(){
    static char *name[]={ "Illegal day",
    "Monday",
    "Tuesday",
    "Wednesday",
    "Thursday",
    "Friday",
    "Saturday",
    "Sunday"};
    char *ps;
    int i;
    char *day_name(char *name[],int n);
    printf("input Day No:\n");
    scanf("%d",&i);
    if(i<0) exit(1);
    ps=day_name(name,i);
    printf("Day No:--->%s\n",i,ps);
    }
    char *day_name(char *name[],int n)
    {
    char *pp1,*pp2;
    pp1=*name;
    pp2=*(name n);
    return((n<1||n>7)? pp1:pp2);
    }
    下例要求输入5个国名并按字母挨次排列后输入。在曩昔的例子中回收了平常的排序体式格局, 逐一对比之后交流字符串的职位。交流字符串的物理职位是颠末字符串复制函数完成的。 重复的交流把使步调执行的速度很慢,同时由于各字符串(国名) 的长度分歧,又增长了存储治理的担负。 用指针数组能很好地操持这些题目。把一切的字符串寄放在一个数组中, 把这些字符数组的首所在放在一个指针数组中,当需要交流两个字符串时, 只须交流指针数组照应两元素的内容(所在)即可,而不消交流字符串本身。步调中界说了两个函数,一个名为sort完成排序, 其形参为指
    针数组name,即为待排序的各字符串数组的指针。形参n为字符串的个数。另一个函数名为print,用于排序后字符串的输入,其形参与sort的形参相反。主函数main中,界说了指针数组name 并作了初始化赋值。然后分辨调用sort函数和print函数完成排序和输入。值得分析的是在sort函数中,对两个字符串对比,回收了strcmp 函数,strcmp函数答允参与对比的串以指针体式格局呈现。name[k]和name[ j]均为指针,是所以合法的。字符串对比后需要交流时, 只交流指针数组元素的值,而不交流详细的字符串, 多么把除夜除夜增长工夫的开支,进步了运转从命。
    现编程如下:
    #include"string.h"
    main(){
    void sort(char *name[],int n);
    void print(char *name[],int n);
    static char *name[]={ "CHINA","AMERICA","AUSTRALIA",
    "FRANCE","GERMAN"};
    int n=5;
    sort(name,n);
    print(name,n);
    }
    void sort(char *name[],int n){
    char *pt;
    int i,j,k;
    for(i=0;i<n-1;i ){
    k=i;
    for(j=i 1;j<n;j )
    if(strcmp(name[k],name[j])>0) k=j;
    if(k!=i){
    pt=name[i];
    name[i]=name[k];
    name[k]=pt;
    }
    }
    }
    void print(char *name[],int n){
    int i;
    for (i=0;i<n;i ) printf("%s\n",name[i]);
    }




    版权声明: 原创作品,答允转载,转载时请务必以超链接体式格局标明文章 原始出处 、作者信息和本声明。不然将追究执法责任。

  • 相关阅读:
    强连通 HDU 1827
    强联通 HDU 2767 3836
    强连通 HDU 1269
    网络流 poj 2135
    强联通 poj 2762
    android20-[【转】Android的EditText自动获取焦点并弹出输入法问题]
    windows开发中的一点总结
    android19
    android18
    android17
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1975589.html
Copyright © 2011-2022 走看看