void funcPointerArray(){
//1、指针表达字符串 (str只是存了字符串在常量区内的地址,而字符串内容是一个常量,不能修改
char * str="hello";
printf("str---%s\n",str+1); //ello
//2、数组表示字符串 (以单个字符组成字符数组表达字符串时,不要忘记结束符\0)
//数组表示的字符串是可以修改的
char str2[]={'y','e','s','\0'}; //一定要注意结束符
char str3[]={"boys"}; //boys\0
printf("sizeof str3 %d\n",sizeof(str3)/sizeof(char));//5
char str4[]="girl";
//一般指针数组用来保存多个字符串
char *name[5]={"Alex","Cherry","Josef"};
int i;
for(i=0;i<5;i++){
printf(" item %s\n", name[i]);
}
}
结果
str---ello
sizeof str3 5
item Alex
item Cherry
item Josef
item (null)
item (null)
字符串的概念:
字符串就是以’\0’结尾的若干的字符的集合
字符串的存储形式: 数组、字符串指针、堆
1、 char string[100] = “I love C!”
定义了一个字符数组string,用来存放多个字符,并且用”I love C!”给string数组初始
化 ,字符串“I love C!”存放在string中
2、 char *str = “I love C!”
定义了一个指针变量str,只能存放字符地址编号,
所以说I love C! 这个字符串中的字符不能存放在str指针变量中。
str只是存放了字符I的地址编号,“I love C!”存放在文字常量区
3、 char *str =(char*)malloc(10*sizeof(char));
动态申请了10个字节的存储空间,首地址给str赋值。
strcpy(str,"I love C");//将字符串“I love C!”拷贝到str指向的内存里
总结:
字符数组:
在内存(栈、静态全局区)中开辟了一段空间存放字符串
字符串指针:
在文字常量区开辟了一段空间存放字符串,将字符串的
首地址
付给str
堆:
使用malloc函数在堆区申请空间,将字符串拷贝到堆区
注意:
可修改性:
1. 栈和全局区内存中的内容是可修改的
char str[100]=”I love C!”;
str[0]=‘y’;//正确可以修改的
2. 文字常量区里的内容是不可修改的
char *str=”I love C!”;
*str =’y’;//错误,I存放在文字常量区,不可修改
3. 堆区的内容是可以修改的
char *str =(char*)malloc(10*sizeof(char));
strcpy(str,"I love C");
*str=’y’;//正确,可以,因为堆区内容是可修改的
注意:str指针指向的内存能不能被修改,要看str指向哪里。
str指向文字常量区的时候,内存里的内容不可修改
str指向栈、堆、静态全局区的时候,内存的内容是可以修改
--------------------------------------------------------------------------------------------------------------------
初始化:
字符数组、指针指向的字符串:定义时直接初始化
char buf_aver[]="hello world";
char *buf_point="hello world";
堆中存放的字符串不能初始化、只能使用strcpy、scanf赋值
char *buf_heap;
buf_heap=(char *)malloc(15);
strcpy(buf_heap,"hello world");
scanf(“%s”,buf_heap);
--------------------------------------------------------------------------------------------------------------------
使用时赋值
字符数组:使用scanf或者strcpy
char buf_aver[128];
buf_aver="hello kitty"; 错误,
因为字符数组的名字是个常量(指针常量的位置不能再被修改)
这个怎么理解?数组声明时已经给定128的内存大小,内存位置已经确定。(假设0x8801)“hello Kitty” 在赋值语句中,其实是一个字符串常量,存在常量区,地址也是确定的(假设 0x0002)可以理解为,一个常量区的地址,赋给一个指针常量(数组名),所以是错的。
strcpy(buf_aver,"hello kitty"); 正确
scanf("%s",buf_aver); 正确 (已经开辟了内存空间 128)
指向字符串的指针:
char *buf_point;
buf_point="hello kitty"; 正确,buf_point指向另一个字符串
strcpy(buf_point,"hello kitty"); 错误,只读,能不能复制字符串到buf_piont指向
的内存里 //没用指明空间大小,且该块内存在文字常量区
取决于buf_point指向哪里。