我们在学习C语言的过程中,都会遇到关于字符串数组和字符串指针相同与不同点的探讨。为了能做出一个清楚的说明,这里笔者就对其异同做出详细的解析。
一、定义及其引用
字符串数组定义就是很多字符型元素集合,在C语言中记作为:char str[] = {“This is a test”};
其中str叫作数组名,它为一个常量,表示该数组的首址,不可以试图改变str的大小,如:str= str+1。需要引用时可以通过str或者*(str+i),i=0,1,…,strlen(str)-1,访问各个该数组中的各个元素。
字符串指针就是一个指向字符串的指针变量,该指针可以指向字符串中的任何一个元素。C语言中记作为:char* str = “This is a test”;通过指针变量可滑动的特点可以使用*(str+i),i=0,1,…,strlen(str)-1,访问其所指向的字符串空间里面的任何一个元素。
二、数据空间
首先我们先看一个例子:
MyFun1:
char* MyFun1(void)
{
char* str = “This is a test”;
return str;
}
MyFun2:
char* MyFun2(void)
{
char str[] = {“This is a test”};
return str;
}
在测试程序中编辑好自己的测试函数后,在主程序中我们可以试图调用这个两个函数,即观察能否得到在两个函数中定义的数据。测试程序如下。
void main()
{
printf(“%s\n”, MyFun1());
printf(“%s\n”, MyFun2());
}
运行程序后,我们会发现MyFun2这个函数不能打印出我们在这个函数中定义的字符串数组中各个元素,其实这也是很容易理解,因为在子程序中定义的变量都属于局部变量在函数运行结束后其所占的内存空间都要被释放。MyFun1却带回来正确的结果,打印的结果刚好为在MyFun1中定义的字符串变量所指向的字符串。经过反复的调试,笔者发现用字符串指针初始化的字符串都是作为常量表来处理的,也就是说其字符串中的元素都放到了用户的程序存储空间。利用这个特点我们还可以方便的将整型变量转化为字符型变量,例如在控制系统中经常会有将时钟芯片里面星期这个整型量转化为字符串,即星期一就转化为Mon,星期日转化为Sun.等等。可以编辑以下函数
char* NumToStr(char num_week)
{
char* str_week[] = {
"Mon.","Tue.","Wed.","Thr.","Fri.","Sat.","Sun."
};
return str_week[num_week-1];
}
此编辑好的函数只要在主程序调用即可,当然实现转化函数形式还有很多,这里仅仅说明字符串指针可以这样应用其根本原因就是使用字符串指针初始化字符串都是放在用户的程序存储区,当然该指针同样也是可以指向用户的数据存储区,只不过初始化时的字符串会一直驻留在程序存储空间上,而字符型数组定义的字符串其数据存放的用户的数据存储区。
三、存储单元分配
字符串指针定义后系统分配一个内存地址数据给该变量,一般为4个字节,因为目前大多数用户的机器都为32位机。而字符串数组定义以后系统需要分配一个指定长度单元,并且每个单元为字符型变量在该编译器下的长度
四、赋值
如果定义的字符串指针和字符串数组都没有初始化,在后面对其赋值时,字符串数组赋值时必须逐个元素赋值,而字符串指针变量可以直接把字符串首址赋给变量,即可以对指向的字符串访问。如下所示,
数组赋值:
char a[20],i = 0;
while(getchar() != ‘\n’)
{
*(a + i++) = getchar();
}
*(a + i) = ‘\0’;//补字符串结束符
字符串指针赋值:
char** p;
char* color[3] = {“red”,”green”,”blue”};
p = &color[0];//*p即为color的数值,为内存地址
五、小结
把字符串指针和字符串数组的区别分清楚对以后的编程是很有裨益的,笔者分别从定义、引用、数据空间、赋值以及存储单元分配上对其进行了一一的比较。较为全面的阐述了字符串指针和字符串数组的主要区别,对我们以后的C程序设计中正确的使用有着很好的指导作用。
注:本文中所有出现的程序或者程序段都是在C-Free4.0 Window XP 环境下测试完成的。
文章评论(0条评论)
登录后参与讨论