zoukankan      html  css  js  c++  java
  • 指针和数组、字符串 | C语言教程 | C语言系列教程

    指针和数组、字符串 | C语言教程 | C语言系列教程

    12章 指针和数组、字符串

    一、数组和指针的关系

    下面仍然是初学者容易搞错的地方。指针变量加n或减n,并不是地址加n或减n,而是当前所指的地址向后或向前跳n次所指的地址。

    
    #include <stdio.h>
    
    int main(void)
    {
        int num[] = {50, 25, 75, 100};
        int *pt;
    
        pt = num + 1;   //故意将第2个元素地址赋给指针变量
    
        //显示指针变量所指的地址以及指针的值
        printf("pt  =%d, *pt    =%d\n\n", pt,   *pt);
    
        //当指针变量减1或加1时,所指的地址并不减1或加1,而是加减4,因为int是4个字节
        printf("pt-1=%d, *(pt-1)=%d\n", pt-1, *(pt-1));
        printf("pt  =%d, *pt    =%d\n", pt,   *pt);
        printf("pt+1=%d, *(pt+1)=%d\n", pt+1, *(pt+1));
    
        //显示pt当作数组用时的值。(注意:[-1]仍然是正确的)
        printf("\npt[0]=%d, pt[-1]=%d\n", pt[0], pt[-1]);
    
        return 0;
    }
    二、指针数组

    char型的指针数组相当于二维字符数组,并不等于说指针数组可以直接转化为二为字符数组,相反字符数组可以直接转化为指针数组。因为二维字符数组的地址是连续的,而指针数组所指的元素不一定连续(如下的m1、m2、m3的地址可以不连续,长度也可以不一样)。

    
    #include <stdio.h>
    
    int main(void)
    {
        char *m1 = "www.quanxue.cn";
        char *m2 = "www.51minge.com";
        char *m3 = "这儿是小雅的C语言教程";
    
        char *message[3];                  //|  #include <stdio.h>
        int i;                             //|
                                           //|  int main(void)
        message[0] = m1;                   //|  {
        message[1] = m2;                   //|      char *message[] = {"www.quanxue.cn",
        message[2] = m3;                   //|                         "www.51minge.com",
                                           //|                         "这儿是小雅的C语言教程"};
        for (i=0; i<3; i++) {              //|      for (i=0; i<3; i++) {
            printf("%s\n", message[i]);    //|          printf("%s\n", message[i]);
        }                                  //|      }
                                           //|
        return 0;                          //|      return 0;
    }                                      //|  }
    三、指向指针的指针

    在第一章讲main()函数的参数时,已经见过指针的指针,这和指针数组有相同的作用,但还是有细小的区别。指针数组可以在定义时直接初始化,而指向指针的指针不行。正如二维数组一样,不指定第二维长度不能直接初始化一样。即不能char str[][]={"...", "...", ...}

    
    #include <stdio.h>
    
    int main(void)
    {
        char *message[] = {"www.quanxue.cn",
                           "www.51minge.com",
                           "这儿是小雅的C语言教程"};
        char **p;       //指向指针的指针
        int i;
    
        p = message;    //指向指针的指针赋初值
        for (i=0; i<3; i++) {
            printf("%s\n", p[i]);
        }
    
        return 0;
    }
    四、指针的长度

    让许多初学者遗憾的是,C语言没有提供数组长度的函数,但可以用sizeof()运算符先求数组的总长度,再求出数组类型的长度,二者相除便得到数组的长度。C语言更大的一个遗憾便是,sizeof()对指针变量求值时,结果总是4,这是因为指针变量的内容是地址,地址总是4个字节来表示。

    因此有经验的编程人员,在用指针作参数时,一般总是同时多定义一个参数,来存放其长度。也就是指针和其长度同时传递过去。另外,数组长度如果事先知道,一般定义为常量。

    
    #include <stdio.h>
    
    int main(void)
    {
        char *msg[] = {"www.quanxue.cn",
                       "www.51minge.com",
                       "这儿是小雅的C语言教程"};
        double dNum[] = {12.5, 24.55, 100.83};
        double *p = dNum;
    
        printf("dNum的size:%2d, 数组个数是:%d\n", sizeof(dNum), (int)sizeof(dNum)/sizeof(double));
        printf("   p的size:%2d, 数组个数是:%d\n", sizeof(p   ), (int)sizeof(p   )/sizeof(double));
        printf(" msg的size:%2d, 数组个数是:%d\n", sizeof(msg ), (int)sizeof(msg )/sizeof(char *));
    
        return 0;
    }

  • 相关阅读:
    v-for基本使用
    SSH
    Git 命令
    bower笔记
    gulp使用例子
    yeoman使用例子
    grunt搭建
    不会误解的名字
    Python 多线程 多进程
    Python 协程
  • 原文地址:https://www.cnblogs.com/lexus/p/2584026.html
Copyright © 2011-2022 走看看