C 字符串指针与字符数组的区别
1.
【字符串指针变量】本身是一个变量,用于存放字符串的首地址。
而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。
【字符数组】是由于若干个数组元素组成的,它可用来存放整个字符串。
2.
对字符串指针方式
char *ps="c language";
可以写为:
char *ps;
ps="c language";
而对数组方式:
char st[20]="c language";
不能写为:
char st[20];
st="c language";
【编译报错】
error c2106: '=' : left operand must be l-value
而只能对字符数组的各元素逐个赋值。
从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。
当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。
一个错误的例子,如下:
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”;
如指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变。
下面是一个在6中的一个例子,完成将一个字符串中的所有大写字母全部转换为小写字母的功能:
#include<iostream.h> #include<ctype.h> int strlower(char *string) { if(string==null) return -1; while(*string) { if(isupper(*string)) *string=tolower(*string); string++; } *string='\0'; return 0; } /*char *strlower(char *string) { char *s; if (string == null) { return null; } s = string; while (*s) { if (isupper(*s)) { *s = (char) tolower(*s); } s++; } *s = '\0'; return string; } */ void main() { char *test="abcdefghijklmn"; strlower(test); cout<<test<<endl; }
上一篇: PHP环境搭建
下一篇: 利用c语言实现在一个3*3棋盘游戏
推荐阅读
-
C语言中值得深入知识点----数组做函数参数、数组名a与&a区别、数组名a的"数据类型"
-
C# 16进制与字符串、字节数组之间的转换
-
javascript 中数组的创建 添加 与将数组转换成字符串 页面三种提交请求的方式
-
js中null与空字符串""的区别讲解
-
c++-重载等号,数组,指针,字符串类
-
C#实现char字符数组与字符串相互转换的方法
-
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
-
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
-
总结C#删除字符串数组中空字符串的几种方法
-
php的数组与字符串的转换函数整理汇总