定义字符串 && 字符串数组
http://blog.163.com/yunfei_lei@126/blog/static/14086456120119256585698/
假设一个一维数组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
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)来执行的
}
#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);