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);

  • 相关阅读:
    The analysis of China's holding the Olympic Games
    ASP.NET获取客户端的操作系统、浏览器、.NET版本等信息(图)
    ASP.NET 无提示关闭窗口
    VC 使用CryptoAPI计算Hash值:MD5, SHA
    SQL Server 2005 中设置某个用户对某一个数据库有完全控制的权限
    C# 计算文件的MD5值
    VC 获取物理网卡的MAC地址
    哪些免费邮箱不在邮件内容里插广告?
    忆同学
    使用正则表达式获取连接字符串某项的值
  • 原文地址:https://www.cnblogs.com/wb118115/p/3172001.html
Copyright © 2011-2022 走看看