zoukankan      html  css  js  c++  java
  • 定义字符串 && 字符串数组

    http://blog.163.com/yunfei_lei@126/blog/static/14086456120119256585698/

    定义字符串 && 字符串数组

    2011-10-25 18:58:05| 分类: C/C++ | 标签: |字号订阅

     
     


    1.用指针对二维数组的取值(要写到二维数组区域中)

    假设一个一维数组a[]

    很显然一维数组取值是 *(a+i) i代表指针的偏移量 a表示的是该数组的首地址

    二维数组其实也就如同一维数组 只不过这个一维数组的元素是一个一维数组

    所以对于二维数组arr[][] *(*(arr+i)+j) arr+i 是指向到arr中第i个元素

    *(arr+i) 就是指向到2维数组中某一个元素 该元素本身又是一个数组

    因此综合起来就是*(*(arr+i)+j)

    虽然二维数组可以理解为一维数组 但是不能通过 *p=arr 这样的方式去指向

    void testArr(){

    int arr1[]={1,2,3};

    int *p=arr1; //这句话拆开应该是 int *p; p=arr1 最终p才是指针变量

    int arr2[3][3]={{1,2,3},{4,5,6}};

    p=arr2[0];

    int (*pp)[3]=arr2; //虽然二维数组可以理解为一维数组 但是不能像上面那样定义一个指针指向它

    //要像这样 定义一个指针数组指向2维数组

    pp++; //如果把2维数组看做一个矩阵 这相当于移动到下一行

    //指针原本指向 {1,2,3} 这个元素, 现在指向了{4,5,6}

    printf("%d",*(*pp+1 )); //输出5

    }
    2.指向字符串的指针变量

    char *str="sdsdsds";

    printf("%s", str );

    或者

    char *str;

    str="sdsdsds";

    printf("%s", str );

    // 注意赋给str的不是字符串 也不是字符 而是字符串的首地址

    但是如果换成这样就不行:

    char *str;

    *str="sdsdsds";

    printf("%s", str );
    3.字符串指针作为参数(数组复制)

    常见做法:

    #include "stdio.h "

    void copy_str(char from[], char dest[] ){

    int i=0;

    for (;from[i]!='';i++ )

    {

    dest[i]=from[i];

    }

    dest[i]='';

    }

    void main(){

    char from[]="sdsdsdfsf";

    char dest[]="dfdsdgfg";

    copy_str(from,dest);

    printf("%s",dest );

    }

    使用指针作为参数

    #include "stdio.h "

    void copy_str(char *from, char *dest ){

    for (;*from!=''; from++,*dest++ )

    {

    *dest=*from;

    }

    *dest='';

    }

    void main(){

    char from[]="sdsdsdfsf";

    char dest[]="123";

    copy_str(from,dest);

    printf("%s",dest );

    }

    copy_str 中的for循环可以改写为

    while ((*dest=*from)!='' )

    {

    from++;

    dest++;

    }

    或者进一步:

    while ((*dest++=*from++)!='' );
    指针的移动

    void main(){

    char *a="i love rilakkuma";

    char *p=a+7; //移动指针

    printf("%s",p );

    printf("%c",a[5]);//虽然没有定义数组a 但由于字符串在内存中是以数组的形式存放的

    //a[5]是按照*(a+5)来执行的

    }

    输出 rilakkumae
    指针数组

    #include "stdio.h "

    void testArr();

    char str[][5]={"Bill","Sam","Jim","Paul","0"};

    //定义了一个数组 存放的数组类型是char指针型

    //该指针指向一个字符串数组 也就是char型的2维数组

    char *Names[]=

    {

    "Bill",

    "Sam",

    "Jim",

    "Paul",

    "0"

    };

    void main()

    {

    //Names 本身是一个指针数组 Names是数组名 那么代表的是Names数组第一个元素地址

    // *Names 就是根据地址区出地址中的内容

    //printf("%s ", *(&Names[0])); // 也就是说 *Names 和 *(&Names[0]) 一样

    printf("%s, ", *Names ); // 输出Bill, 实际上Names指向的是一个2维数组

    char **p=Names; //由于Names本身是一个指针数组 想要指向指针数组 应定义一个2级指针

    while(*p!=0 ){

    printf("%s ",*p );

    p++;

    }

    *p=Names[0];

    testArr();

    }

    void testArr(){

    int arr1[]={1,2,3};

    int *p=arr1; //这句话拆开应该是 int *p; p=arr1 最终p才是指针变量

    int arr2[3][3]={{1,2,3},{4,5,6}};

    p=arr2[0];

    int (*pp)[3]=arr2; //虽然二维数组可以理解为一维数组 但是不能像上面那样定义一个指针指向它

    //要像这样 定义一个指针数组指向2维数组

    pp++; //如果把2维数组看做一个矩阵 这相当于移动到下一行

    //指针原本指向 {1,2,3} 这个元素, 现在指向了{4,5,6}

    printf("%d",*(*pp)+1 ); //输出5

    }

    示例2

    #include "stdio.h "

    void main(){

    char arr[]={"123"};// 或者是{'1','2','3' };

    char str[][6]={ "i'm"," 28"," year"," old"," my"," dear"," u" }; //注意要指定高维数组的大小 其长度为该数组最长元素的字符个数+1

    char *p=arr;

    while(*p!='' ){

    printf("%c",*p);

    p++;

    }

    printf(" ");

    char *name[]={ "sss","ddd","ggg" }; //不能写成 *name[]=str

    char **pp=name;

    printf("%s ",*pp);//输出sss

    printf("%c ", *(*pp));//或者简写为printf("%c ", **pp); //输出s

    int i=0;

    while ( i<3)

    {

    i++;

    printf("%s ",*pp);

    pp++;

    }

    //**pp 两个*的含义

    //如果只有一颗* 表示指向字符数据的指针

    //两颗* 表示指向字符指针的指针

    }
    给字符型数组赋值一个字符串

    定义一个字符数组
    char str[20]="123123";
    char str2[20]={'1','2','3' };

    但是注意不能像下面这样
    char str[];
    str="123123";
    使用数组的时候,如果在定义数组的同时并没有对其初始化,必须要指定该数组的长度,否则系统不知道如何为其分配空间
    要么char str[]="123123"; 要么char str[20]; 不能是 char str[];
    如果是通过char str[20];这样的方式定义的数组
    后面就不能再通过str={“xxxx”} 或是 str={‘x’, ‘x’, ‘x’, }这样的方式赋值了
    目前发现可以这样
    char str[3];
    str[1]='2';
    //。。。。
    难道C语言中就不能先顶一个字符串然后在用的时候再赋值吗?
    当然可以 用strcpy这个函数
    strcpy(str,"address" );

    < xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
    strcat 的使用

    char s3[]="sss";

    char s4[]={"345"};

    //printf("%s ",strcat(s3,s4) ); // 和下面用指针输出的效果相同

    char *s5=strcat(s3,s4);

    printf("%s " ,s5);

  • 相关阅读:
    修复PLSQL Developer 与 Office 2010的集成导出Excel 功能
    Using svn in CLI with Batch
    mysql 备份数据库 mysqldump
    Red Hat 5.8 CentOS 6.5 共用 输入法
    HP 4411s Install Red Hat Enterprise Linux 5.8) Wireless Driver
    变更RHEL(Red Hat Enterprise Linux 5.8)更新源使之自动更新
    RedHat 5.6 问题简记
    Weblogic 9.2和10.3 改密码 一站完成
    ExtJS Tab里放Grid高度自适应问题,官方Perfect方案。
    文件和目录之utime函数
  • 原文地址:https://www.cnblogs.com/wb118115/p/3172001.html
Copyright © 2011-2022 走看看