C 指针与字符串表达

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指向哪里。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值