用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题:
1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。
2. 对字符串指针方式
char *ps="C Language";
可以写为:
char *ps;
ps="C Language";
而对数组方式:
static char st[]={"C Language"};
不能写为:
char st[20];
st={"C Language"};
而只能对字符数组的各元素逐个赋值。
从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。
当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。
一个错误的例子,如下:
char *name;
scanf("%s",name);
printf("%s",name);
有的编译器虽然也能通过,但这是错误的,因为是个指针,定义时指向不可用的地址。解决这个问题有两种方法:用数组的方法或给字符针针分配内存空间的方法。
数组的方法:
char name[20];
scanf("%s",name);
printf("%s",name);
给字符针针分配内存空间的办法:
char *name;
name=(char*)malloc(50); //此时name已经指向一个刚刚分配的地址空间。
scanf("%s",name);
printf("%s",name);
但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。
3.int main()
{
char str1[40]="hello world!"; //char *str1="hello world!";
str1[4]='A'; //若str1是指针型的,编译通过,但运行是此处会段错误
printf("%s\n",str1);
return 0;
}
数组和指针都可以在它们的定义中用字符串常量进行初始化,尽管看上去一样,底层的实现机制却不相同。
定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。例如:下面的定义创建了一个字符串常量(为其分配了内存):
char *p=”abcdefg”;
注意只有对字符串常量才是如此,不能指望为浮点数之类的常量分配空间,如:
Float *p=3.14; /*错误,无法通过编译*/
下面结合一个实例谈谈初始化指针时创建的字符串常量与数组中的字符串的区别:
- 在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
- 数组也可以用字符串常量进行初始化:
Char a[]=”abcdefg”;
如指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变。
下面是一个在vc6中的一个例子,完成将一个字符串中的所有大写字母全部转换为小写字母的功能:
-
ViewCode
-
1#include<iostream.h>
-
2#include<ctype.h>
-
3
-
4
-
5
-
-
-
8
-
9intstrlower(char*string)
-
10{
-
11if(string==NULL)
-
12{
-
13return-1;
-
14}
-
15
-
16while(*string)
-
17{
-
18if(isupper(*string))
-
19*string=tolower(*string);
-
20string++;
-
21}
-
22*string='\0';
-
23return0;
-
24}
-
25
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
46
-
47voidmain()
-
48{
-
49char*test="ABCDEFGhijklmN";
-
50strlower(test);
-
51cout<<test<<endl;
-
52}
-
其中,如果采用char *test=”ABCDEFGhijklmN”;会产生运行时错误。Char test[]=”ABCDEFGhijklmN”则程序正常运行,原因如前所述。
-
分享到:
相关推荐
C语言用指针将字符串数组位置颠倒,实现ABCDEFGHIJKLMNOPQRSTUVWXYZ转换成ZYXWVUTSRQPONNOPQRSTUVWXYZ
详细介绍了易如何用指针来操作字符串和字符串指针,包括指针数组传参。
实验与指导-数组指针字符串 指针与数组区别
指针与字符串指针数组多级指针及练习PPT学习教案.PPTx
本文档在某知名网站下载,要么浏览量最多,要么最新,保证精品,至少为你节约3RMB。格式为caj或者kdh需要专业阅读器打开。
9.1 1分钟彻底理解指针的概念 9.2 大话C语言指针变量 9.3 C语言指针变量的运算 9.4 数组指针(指向数组的指针) 9.5 字符串指针(指向字符串的
//定义一个指向指针的指针,并赋予指针数组首地址所指向的第一个字符串的地址也就是abc\0字符串的首地址 cout*b|"*(b+1)|"*(b+2); //------------------------------------------------------------------------- ...
指针数组为字符串排序,char* str[] = { "beijing","guangdong","shanghai" };进行排序,内涵冒泡排序和快速排序,原理:更改指针指向
分配一个与原字符串等长的字符数组; 反向拷贝一下即可。 char* reverseString(char* s) { //将q指向字符串最后一个字符 char* q = s ; while( *q ) { q++; } q -= 1 ; //分配空间,存储逆序后的字符串...
字符串是存放在字符数组中的,对字符数组中的字符逐个处理时,前面介绍的指针与数组之间的关系完全适用于字符数组。通常将字符串作为一个整体来使用,用指针来处理字符串更加方便。当用指向字符串的指针来处理字符串...
如何在C语言中处理“字符串”,请善用指针、数组。
C语言第讲指针与字符串字符数组PPT课件.pptx
C语言中的字符串数组和字符串指针.pdf
单片机C语言实例34:用指针数组作为函数的参数显示多个字符串.txt
用指针数组的方法将字符串排序
这是老师做的PPT,关于数组指针与字符串的,转为学习C++的量身定做,非常好用,和大家分享一下,希望一起进步,谢谢!
数组例程详解 指针例程详解 字符串例程详解 PPT详细描述数组、指针和字符串在C程序中的应用
C++课程-3_数组指针与字符串 C++课程-3_数组指针与字符串
用指针数组的方法将字符串排序