标签:
今天发现这样一个问题
#include <iostream> using namespace std; int main() { char ch1[10]; strcpy_s(ch1,"123456");//编译通过 char* p = new char[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类型,如下所示:
const char *p = "world";
例如:
.int main() { char str1[40]="hello world!"; //char *str1="hello world!"; str1[4]=‘A‘; //若str1是指针型的,编译通过,但运行是此处会段错误 printf("%s\n",str1); return 0; }
2.数组和指针都可以在它们的定义中用字符串常量进行初始化,尽管看上去一样,底层的实现机制却不相同。
定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。例如:下面的定义创建了一个字符串常量(为其分配了内存):
char *p=”abcdefg”;
注意只有对字符串常量才是如此,不能指望为浮点数之类的常量分配空间,如:
Float *p=2.34; /*错误,无法通过编译*/
下面结合一个实例谈谈初始化指针时创建的字符串常量与数组中的字符串的区别:
Char a[]=”abcdefg”;
如指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变。
下面是一个在vc6中的一个例子,完成将一个字符串中的所有大写字母全部转换为小写字母的功能:
#include<iostream> #include<ctype.h> using namespace 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‘; 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; }
其中,如果采用char *test=”ABCDEFGhijklmN”;会产生运行时错误。Char test[]=”ABCDEFGhijklmN”则程序正常运行,原因如前所述。
标签:
原文地址:http://www.cnblogs.com/VIPler/p/4342896.html