定义字符串&字符串数组

来源:互联网 发布:银联数据怎么样 编辑:程序博客网 时间:2024/04/29 02:53

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

或者

   

</pre><p style="line-height: 28px; margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px; color: rgb(78, 78, 78); font-family: 'Hiragino Sans GB W3', 'Hiragino Sans GB', Arial, Helvetica, simsun, u5b8bu4f53; font-size: 16px; text-indent: 2em;"></p><p style="line-height: 28px; margin-top: 0px; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px; color: rgb(78, 78, 78); font-family: 'Hiragino Sans GB W3', 'Hiragino Sans GB', Arial, Helvetica, simsun, u5b8bu4f53; font-size: 16px; text-indent: 2em;"><pre name="code" class="html"> 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]!='\0';i++ )    {        dest[i]=from[i];    }    dest[i]='\0';} void main(){    char from[]="sdsdsdfsf";    char dest[]="dfdsdgfg";    copy_str(from,dest);    printf("%s",dest );}

使用指针作为参数

#include "stdio.h "

#include "stdio.h "void copy_str(char from[], char dest[]  ){    int i=0;    for (;from[i]!='\0';i++ )    {        dest[i]=from[i];    }    dest[i]='\0';} void main(){    char from[]="sdsdsdfsf";    char dest[]="dfdsdgfg";    copy_str(from,dest);    printf("%s",dest );}

copy_str 中的for循环可以改写为

   

while ((*dest=*from)!='\0' )    {        from++;        dest++;    }

或者进一步:

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

   

void main(){    char *a="i love rilakkuma";    char *p=a+7; //移动指针    printf("%s",p );    printf("%c",a[5]);//虽然没有定义数组a 但由于字符串在内存中是以数组的形式存放的                      //a[5]是按照*(a+5)来执行的}

输出 rilakkumae
5.指针数组

#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\n", *(&Names[0]));  // 也就是说 *Names 和 *(&Names[0]) 一样    printf("%s,\n", *Names ); // 输出Bill, 实际上Names指向的是一个2维数组    char **p=Names;   //由于Names本身是一个指针数组  想要指向指针数组 应定义一个2级指针    while(*p!=0 ){        printf("%s\n",*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!='\0' ){        printf("%c",*p);        p++;    }     printf("\n");    char *name[]={ "sss","ddd","ggg" }; //不能写成 *name[]=str    char **pp=name;    printf("%s\n",*pp);//输出sss    printf("%c\n", *(*pp));//或者简写为printf("%c\n", **pp); //输出s    int i=0;    while ( i<3)    {        i++;        printf("%s\n",*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\n",strcat(s3,s4) ); // 和下面用指针输出的效果相同     char *s5=strcat(s3,s4);    printf("%s\n" ,s5);

0 0
原创粉丝点击