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

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

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

为什么会这样呢?

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

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

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

char a[] = "hello";

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

char *p = "world";

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

语句是错误的:

p[] = 'p';

而如下语句没有问题:

a[] = 'a';

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

const char *p = "world";

例如:

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

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)
    {
    ;
    }
    while(*string)
    {
        if(isupper(*string))
        *string=tolower(*string);
        string++;
    }
    *string='\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++字符串指针与字符数组的区别的更多相关文章

  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. poj2752 Seek the Name, Seek the Fame

    Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and ...

  2. [置顶] 单片机C语言易错知识点经验笔记

    今天写这一篇文章并不是因为已经想好了一篇文章才写下来,而是我要将这一篇文章作为一个长期的笔记来写,我会一直更新.在进行单片机开发时,经常都会出现一些很不起眼的问题,这些问题其实都是很基础的c语言知识点 ...

  3. InsertSort 插入排序

    插入排序:将下一个插入已排好的序列中 自己觉得演示的号的一个文章地址 http://sjjg.js.zwu.edu.cn/SFXX/sf1/zjcr.html 下面是java的实现代码: //Inse ...

  4. phpcms:三、头部包含

    1‘标题:{if isset($SEO['title']) && !empty($SEO['title'])}{$SEO['title']}{/if}{$SEO['site_title ...

  5. #python基础学习模块:marshal 对象的序列化

    #标准库地址:https://docs.python.org/2/library/marshal.html"""有时候,要把内存中一个对象持久化保存磁盘或者序列化二进制流 ...

  6. NetAnalyzer笔记 之 一. 开篇语

    [创建时间:2015-08-26 22:00:12] NetAnalyzer下载地址 第一次写技术相关的博客,不足之处还请担待并告知. 在开始之前,先简单介绍一下NetAnalyzer, NetAna ...

  7. Java Instanceof

    Java Instanceof Instanceof是一个非常简单的运算符,前一个操作通常是一个引用类型的变量,后一个操作数通常是一个类(也可以是接口,可以把接口理解成一种特殊的类),它用于判断前面的 ...

  8. RPG JS跨平台测试

    RPG JS虽然说是跨平台的,但是在具体的测试中效果并不理想. 以官方提供的Demo为例 问题一 手机的屏幕太小,导致画面上的人物都很小,连点击都很不准确.在9寸的平板上才可以看得比较清楚. 问题二 ...

  9. Hacker(21)----密码攻防之加密与解密基础

    密码对于用户而言并不陌生,它是一种用于保护重要信息和文件的工具,只有输入正确的密码才可查看文件和信息的具体内容.黑客为了获取这些信息,会采用各种方式来破解密码,因此用户不仅需要了解黑客破解密码的常用方 ...

  10. Html与css基础

    1.html的定义 (1).html:超文本标记语言(HyperText Markup Language),它主要包括"头"(Head)和"主体"(Body)两 ...