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

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]!='\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 "

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

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

{

*dest=*from;

}

*dest='\0';

}

void main(){

char from[]="sdsdsdfsf";

char dest[]="123";

copy_str(from,dest);

printf("%s",dest );

}

copy_str 中的for循环可以改写为

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

{

from++;

dest++;

}

或者进一步:

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

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

posted @ 2013-07-04 17:34  小心小意  阅读(445)  评论(0编辑  收藏  举报