1. 今天发现这样一个问题
  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. ];
  6. strcpy_s(ch1,");//编译通过
  7. ];
  8. strcpy_s(p,");//报错:不接受2个参数
  9. }

改成如下所示就没有问题:

  1. strcpy_s(p,,");//编译通过

为什么会这样呢?

先看下字符数组与字符串指针的区别:

1.由双引号括起来的字符串常量属于静态存储类型,它被存储在内存的静态存储区内,所以无论字符串常量出现在程序的什么地方,它在程序的整个运行过程中只存储一份。

如果用字符串常量初始化字符数组,就是从静态存储区把整个字符串复制给数组。例如:

  1. char a[] = "hello";

如果用字符串常量初始化字符指针,就是把字符串在静态存储区的地址复制给指针。例如:

  1. char *p = "world";

这两种形式的一个重要区别是不能通过指针来修改字符串的值,但是字符数组不存在这个问题,如

语句是错误的:

  1. p[] = 'p';

而如下语句没有问题:

  1. a[] = 'a';

为了避免通过指针修改字符串的错误,建议将字符指针声明为const类型,如下所示:

  1. const char *p = "world";

例如:

  1. .int main()
  2. {
  3. ]="hello world!"; //char *str1="hello world!";
  4. str1[]='A'; //若str1是指针型的,编译通过,但运行是此处会段错误
  5. printf("%s\n",str1);
  6. ;
  7. }

2.数组和指针都可以在它们的定义中用字符串常量进行初始化,尽管看上去一样,底层的实现机制却不相同。

定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。例如:下面的定义创建了一个字符串常量(为其分配了内存):

  1. char *p=”abcdefg”;

注意只有对字符串常量才是如此,不能指望为浮点数之类的常量分配空间,如:

  1. Float *p=2.34; /*错误,无法通过编译*/

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

  1. 在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。

  2. 数组也可以用字符串常量进行初始化:
    1. Char a[]=”abcdefg”;

如指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变。

下面是一个在vc6中的一个例子,完成将一个字符串中的所有大写字母全部转换为小写字母的功能:

  1. #include<iostream>
  2. #include<ctype.h>
  3. using namespace std;
  4. /******************************************************************************/
  5. /*
  6. * Convert a string to lower case
  7. */
  8.  
  9. int strlower(char *string)
  10. {
  11. if(string==NULL)
  12. {
  13. ;
  14. }
  15. while(*string)
  16. {
  17. if(isupper(*string))
  18. *string=tolower(*string);
  19. string++;
  20. }
  21. *string='\0';
  22. ;
  23. }
  24. /*
  25. char *strlower(char *string)
  26. {
  27. char *s;
  28. if(string == NULL)
  29. {
  30. return NULL;
  31. }
  32. s = string;
  33. while(*s)
  34. {
  35. if(isupper(*s))
  36. {
  37. *s = (char) tolower(*s);
  38. }
  39. s++;
  40. }
  41. *s = '\0';
  42. return string;
  43. }
  44. */
  45. void main()
  46. {
  47. char *test="ABCDEFGhijklmN";
  48. strlower(test);
  49. cout<<test<<endl;
  50. }

其中,如果采用char *test=”ABCDEFGhijklmN”;会产生运行时错误。Char test[]=”ABCDEFGhijklmN”则程序正常运行,原因如前所述。

C++字符串指针与字符数组的区别的更多相关文章

  1. Delphi的字符(Char),字符串(String),字符串指针(PChar),字符数组arrayofchar(来自http://delphi.cjcsoft.net/论坛)

    Delphi有三种类型的字符: AnsiChar这是标准的1字节的ANSI字符,程序员都对它比较熟悉. WideChar这是2字节的Unicode字符. Char在目前相当于AnsiChar,但在De ...

  2. c字符指针与字符数组的区别

    1.定义 char *pchar;  //定义了指针,没赋值之前不能使用.如果:printf("*pchar:%c\n",*pchar); 出现段错误Segmentation fa ...

  3. 【转载】C#中将字符串分割成字符数组

    在C#中字符串类型String是由一系列的单个字符组合而成,其实可以通过字符串String对象ToCharArray()方法来将字符串中的元素逐一存在数据类型为Char的一维数组中. 例如将字符str ...

  4. 【C】字符串常量和字符数组

    此次博客是转载某位博主的文章,不过现在找不到了,所以先声明一下. 先贴一段代码: #include <stdio.h> int main(int argc, const char** ar ...

  5. String.getBytes()和String.tocharArray(),字节数组和字符数组的区别

    String.getBytes()是将字符串转化为一个字节数组.而String.toCharArray()是将一个字符串转化为一个字符数组. [例如] byte bys[] ="国庆60周年 ...

  6. Codeforces Round #369 (Div. 2) A. Bus to Udayland【字符串/二维字符数组求连起来的座位并改为其他字符】

    A. Bus to Udayland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. C++ code:char pointers and char arrays(字符指针与字符数组)

    C-串的正确赋值.复制.修改.比较.连接等方式. #include<iostream> #pragma warning(disable: 4996)//这一句是为了解决“strrev”出现 ...

  8. Linux C\C++基础 字符数组、字符串和字符串常量

    1.字符数组和字符串 C语言没有字符串类型,用字符数组模拟 字符串一定是字符数组,字符数组不一定是字符串 如果字符数组以字符'\0'('\0'等同与数字0)结尾,那么这个字符数组就是字符串 char ...

  9. C语言中整形数组、字符数组、字符串的区别

    一. 第一 整型数组的存放,数组最后是不加'\0'的,字符串会自动加上,因此存放字符的时候数组的大小要比实际字符的多一个 第二 整型数组 每一个单元是4个字节的,字符串是一个一个字符存放的,每个字符占 ...

随机推荐

  1. IDF实验室解题学习笔记1

    1.图片里的英文 图片可以有很多种打开方式,破解该题,需将图片下载下来. 对于图片,我们可以使用图片编辑软件,进行各种调明暗,变色调等操作. 我们还可以使用2进制或者16进制的文件打开方式打开.该图使 ...

  2. 深入了解Json转变为map的思想,附源代码2

    最近在做一个投票情况的用例,返回的结果打算放到JSON中 数据库的结果集如上图所示:optionkey代表选项,optionval代表其值 第一次做的时候考虑应该键值对应的关系,所以前台接到的json ...

  3. 常用的js对象扩展方法

    1. 字符串的replaceAll String.prototype.replaceAll = function(reallyDo, replaceWith, ignoreCase) { if (!R ...

  4. 利用libevent的timer实现定时器interval

    在不怎么了解libevent的情况下,看到timer这个关键字想到可以用来做定时任务,官方资料也不齐全,就从代码里看到了TIMEOUT字样,这么说来应该是支持timeout了,那interval呢,貌 ...

  5. JavaScript 变量类型 保存内存中的位置 和 引用

    1. JavaScript变量 基本类型值在内存中占据固定大小的空间 因此被保存在栈内存中. 从一个变量向另一个变量复制基本来下的值 会创建这个值得一个副本. 引用类型的值是对象 保存在堆内存中. 包 ...

  6. AIX 7.1 安装 Python2.7.5

    一.下载必要的安装包 1. gdbm-1.8.3-5.aix5.2.ppc.rpm  下载地址:ftp://ftp.software.ibm.com/aix/freeSoftware/aixtoolb ...

  7. 使用xdebug+eclipse远程调试centOS7上的PHP代码

    这两天一直在研究PHP代码的调试,原来开发一直用的var_dump,麻烦! 最近发现能使用xdebug+eclipse远程单步调试PHP,但是百度后实现此技术的文章都写得不够具体. 我照着这里零散的文 ...

  8. VS2010 rdlc 被除数为0 显示错误号

    =Sum(Fields!ROCKNUM.Value/Fields!SEND.Value*100) 当Fields!SEND.Value为0或者空时,显示错误号 修改: =IIF(isnothing(F ...

  9. Lanucherr 默认显示第几屏

    Launcher.java static final int SCREEN_COUNT = 5;static final int DEFAULT_SCREEN = 2;//第一页是从0开始计数,这里是 ...

  10. PDO LIMIT bug

    PDO存在一个LIMIT BUG(mysql) 需要指定数据类型,而且limit后面跟的2个参数必须是数值类型,不然的话获取不到数据 例1: $dsn = "mysql:host=127.0 ...