C语言自学完备手册(30)——指针(4)
自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理
探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制
Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南
讲给Android程序员看的前端系列教程(图文版)
讲给Android程序员看的前端系列教程(视频版)
Android程序员C语言自学完备手册
版权声明
- 本文原创作者:谷哥的小弟
- 作者博客地址:http://blog.csdn.net/lfdfhl
在本篇博客中介绍字符串和指针的密切关系。
字符串的两种实现方式
字符串常见的实现方式有如下两种:
- 方式1:利用数组实现字符串
- 方式2:利用指针实现字符串
请看如下示例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//方式1:利用数组实现字符串
char str[]="ABC";
//方式2:利用指针实现字符串
char *ptr="123";
printf("str="%s",sizeof(str)=%d
",str,sizeof(str));
printf("ptr="%s",sizeof(ptr)=%d,sizeof("123")=%d
",ptr,sizeof(ptr),sizeof("123"));
return 0;
}
在本示例中用两种方式实现了字符串。
结果如下:
str="ABC",sizeof(str)=4
ptr="123",sizeof(ptr)=4,sizeof("123")=4
图示如下:
在示例代码和图示之后,我们再来分别深入地学习这两种字符串的实现方式。
利用数组实现字符串
在方式中,str是char[4]型的数组,各元素从头开始依次使用’A’、‘B’、‘C’、’ ’进行初始化。在该方式中,数组str占用4个字节的内存空间。
既然是数组,那么可通过下标的方式访问元素,例如:
printf("str[0]=%c
",str[0]);//结果为:str[0]=A
当然也可通过下标修改元素:例如:
str[0]="D";
printf("str[0]=%c
",str[0]);//结果为:str[0]=D
但是,一定要注意:在该方式中不可以再次为str赋值,例如:str="DEF";
,这一点在之前我们也反复强调过:赋值表达式的左侧不可为数组名! 虽然说左侧的数组名会被解释为数组起始元素的地址,但是依然不可以改写其值。其实,也可以反向思考一下:如果可以赋值,那岂不是就改变了原数组在内存中的地址了?这是不可以的。
利用指针实现字符串
在该方式中,ptr是指向char型变量的指针,它的初始值为字符串字面量"123"并指向该字面量的第一个字符。从图示中,我们也可以看出来指针ptr和字符串字面量“123”都会占用内存空间(即sizeof(ptr)=4,sizeof("123")=4
)。也就是说:对于同一个字符串而言,用指针实现的字符串比用数组实现的字符串需要更多的内存空间。
既然是数组,那么可通过下标的方式访问元素,例如:
printf("ptr[0]=%c
",ptr[0]);//结果为:ptr[0]=1
好嘞,继续通过下标的方式修改元素,例如:
ptr[0]="9";
printf("ptr[0]=%c
",ptr[0]);
运行代码可以发现:程序不能够正常执行!这是为什么呢?在利用指针实现的字符串时,该字符串常量被定义为只读;如果试图通过指针修改这个字符串的值程序会出现未定义的异常行为!也就是说:在利用指针实现字符串时可通过指针访问字符串字面量中的内容,但是不能通过指针修改字符串字面量中的内容!
另外,在利用指针实现字符串时指针(例如ptr)不可进行如下声明:
char *ptr={"1","2","3"," "};
因为数组采用的{"1","2","3"," "}
形式的初始值,它不能够被赋值给单一的变量(例如指针ptr),应该被赋值给arrayName[ ];这点是大家容易犯错的。
在利用指针实现字符串时可以再次为指针(例如指针p)赋值么?答案是肯定的。例如:
char *p="123";
p="456";
指针p原本指向字符串字面量“123”之后被再次赋值,指向了新的字符串字面量“456”,此时原来的“123”并不会消失,但变成了无用的内存垃圾;图示如下: