码迷,mamicode.com
首页 > 编程语言 > 详细

C++字符串指针与字符数组的区别

时间:2015-03-16 22:47:45      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

今天发现这样一个问题
#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;  /*错误,无法通过编译*/

下面结合一个实例谈谈初始化指针时创建的字符串常量与数组中的字符串的区别:

  1. 在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
  2. 数组也可以用字符串常量进行初始化:
    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”则程序正常运行,原因如前所述。

C++字符串指针与字符数组的区别

标签:

原文地址:http://www.cnblogs.com/VIPler/p/4342896.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!