首页 / C++ / C++字符串指针与字符数组的区别
C++字符串指针与字符数组的区别
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++字符串指针与字符数组的区别,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1989字,纯文字阅读大概需要3分钟。
内容图文
今天发现这样一个问题
#include <iostream> usingnamespace std; int main() { char ch1[10]; strcpy_s(ch1,"123456");//编译通过char* p = newchar[10]; strcpy_s(p,"123456");//报错:不接受2个参数 }
改成如下所示就没有问题:
strcpy_s(p,10,"123456");//编译通过
为什么会这样呢?
先看下字符数组与字符串指针的区别:
1.由双引号括起来的字符串常量属于静态存储类型,它被存储在内存的静态存储区内,所以无论字符串常量出现在程序的什么地方,它在程序的整个运行过程中只存储一份。
如果用字符串常量初始化字符数组,就是从静态存储区把整个字符串复制给数组。例如:
char a[] = "hello";
如果用字符串常量初始化字符指针,就是把字符串在静态存储区的地址复制给指针。例如:
char *p = "world";
语句是错误的:
p[0] = ‘p‘;
而如下语句没有问题:
a[0] = ‘a‘;
为了避免通过指针修改字符串的错误,建议将字符指针声明为const类型,如下所示:
constchar *p = "world";
例如:
.int main() { char str1[40]="hello world!"; //char *str1="hello world!"; str1[4]=‘A‘; //若str1是指针型的,编译通过,但运行是此处会段错误 printf("%s\n",str1); return0; }
2.数组和指针都可以在它们的定义中用字符串常量进行初始化,尽管看上去一样,底层的实现机制却不相同。
定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。例如:下面的定义创建了一个字符串常量(为其分配了内存):
char *p=”abcdefg”;
注意只有对字符串常量才是如此,不能指望为浮点数之类的常量分配空间,如:
Float *p=2.34; /*错误,无法通过编译*/
下面结合一个实例谈谈初始化指针时创建的字符串常量与数组中的字符串的区别:
- 在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
- 数组也可以用字符串常量进行初始化:
Char a[]=”abcdefg”;
如指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变。
下面是一个在vc6中的一个例子,完成将一个字符串中的所有大写字母全部转换为小写字母的功能:
#include<iostream> #include<ctype.h> usingnamespace std; /******************************************************************************//* * Convert a string to lower case */int strlower(char *string) { if(string==NULL) { return -1; } while(*string) { if(isupper(*string)) *string=tolower(*string); string++; } *string=‘\0‘; return0; } /* 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; }
其中,如果采用char *test=”ABCDEFGhijklmN”;会产生运行时错误。Char test[]=”ABCDEFGhijklmN”则程序正常运行,原因如前所述。
原文:http://www.cnblogs.com/VIPler/p/4342896.html
内容总结
以上是互联网集市为您收集整理的C++字符串指针与字符数组的区别全部内容,希望文章能够帮你解决C++字符串指针与字符数组的区别所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。