最近写程序的时候发现这样一个问题

#include<iostream>
#include <string.h>
using namespace std; void reverse(char *str)
{
int len=strlen(str);
char *p=str;
char *q=str+len-;
while(p<q)
{
char temp=*p;
*p=*q;
*q=temp;
p++;
q--;
}
}
int main()
{
char *n1="";
char n2[]="";
reverse(n1);
reverse(n2);
return ;
}

执行reverse(n1);的时候会出现下面的错误,而如果把这句注释掉执行reverse(n2);却能顺利运行

现在的主要问题是初始化一个字符数组和初始化一个指向字符串的指针的区别,前者可以通过指针改变字符串的单个内容,而后者却不可以,想不明白,于是查阅书籍,在

《C Primer Plus 第五版》 关于字符串的一章中找到了答案。

下面将程序进一步简化,以观察重点:

1、只在程序中写下面两句程序,程序顺利运行

    char n1[]="";
n1[]='';

2、只在程序中写下面两句程序,程序运行出错,错误和上面的一样

    char *n2="";
n2[]='';

为什么会出错呢?书中给的解释是:编译器可能选取内存中同一个单个的拷贝来表示所有相同的字符串文字,如果允许用指针改变字符串的某些字符,会导致其他地方引用字符串出错。

书中给的建议是初始化字符串指针的时候使用const修饰,这样就可以避免在使用的时候发现错误了,当然这样只是将运行错误变成编译错误。

谈谈 char *num="123";和char num[4]="123";的区别的更多相关文章

  1. 【9210】找礼物(char* num[2000]的使用 get char num[i] = new char[1000])

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 新年到了,突然间,就在那美丽的一霎那,你好友和你(K个人)的周围满是礼物,你发扬你帅气的风格,让你的好友先拿 ...

  2. unicode下各种类型转换,CString,string,char*,int,char[]

    把最近用到的各种unicode下类型转换总结了一下,今后遇到其他的再补充: 1.string转CString string a=”abc”; CString str=CString(a.c_str() ...

  3. 【转】深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p

    一.可能的组合: (1)const char*p (2)char const*p (3)char *const p(4)const char **p (5)char const**p (6)char ...

  4. C# byte[]与char[]、string与char[]、byte[] 与 string 互转

    1. byte array -> char array Byte[] b=new byte[5]{0x01,0x02,0x03,0x04,0x05};  Char[] c=Encoding.AS ...

  5. C语言中为什么不能把char**赋给const char**

    这是我在知乎回答的一个问题. 这个问题是C中的一个深坑,首先说结论: char ** 和 const char ** 是两个不相容(incompatible)的类型,能够理解为不能直接赋值 在C11的 ...

  6. char *s="string"和char s[]="string"的区别

    char *s="string"的内容是不可以改的 void main() {     char* pStr1 = "Hello!";     char pSt ...

  7. error LNK2019: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits<char> >

    1,VS2013: 错误 1 error LNK2019: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_trai ...

  8. 深入理解const char*p,char const*p,char *const p,const char **p,char const**p,char *const*p,char**const p

    由于没有const*运算,const实际上修饰的是前面的char*,但不能在定义时转换写成 const(char *)*p,因为在定义是"()"是表示函数. 三.深入理解7种组合 ...

  9. 理解C/C++中const char*、char* const、const char* const、char* const*等等

    先说些题外话,今天学习execve(2)的使用,由于书上代码使用的是C89标准,所以下面这种代码都被我修改了 char* s[] = { "aaa", "bbb" ...

  10. char *p="abc" 与 char p[]="abc" 的区别

    本文来源于网络 出处:点我 有这样一段代码: #include "stdio.h" char *get_string_1() { char p[] = "hello wo ...

随机推荐

  1. 5-Highcharts曲线图之轴反转

    <!DOCTYPE> <html lang='en'> <head> <title>5-Highcharts曲线图之轴反转</title> ...

  2. Beginners Guide To Learn Dimension Reduction Techniques

    Beginners Guide To Learn Dimension Reduction Techniques Introduction Brevity is the soul of wit This ...

  3. tomcat 一个服务 多端口网站

    多站点多端口   <Service name="Catalina">      <Connector port="8080" protocol ...

  4. javascript设计模式--备忘录模式(Memento)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. iOS 隐藏顶部状态栏方式和更改颜色

    plist文件里面添加 AppDelegate: //显示状态栏 [[UIApplication sharedApplication]setStatusBarHidden:NO]; //将状态栏颜色设 ...

  6. NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

    http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言   当管理大量连接时,特别 ...

  7. spring 主题使用详解[转]

    在common_include_v2.jsp文件中,spring主题的使用: <link href="${staticPath }/<spring:theme code='sty ...

  8. springMVC视频教程

    http://edu.51cto.com/index.php?do=lession&id=42165

  9. [RM HA 1] Cloudera CDH5 RM HA功能验证

    简介: 最新的Cloudera CDH5.0.0 beta版本已经支持RM的HA, 笔者为此简单验证了RM HA的功能. 后续将继续分析其HA的原理,以及其与社区RM HA的区别. 集群部属与RM f ...

  10. 李洪强iOS开发之添加手势

    李洪强iOS开发之添加手势 02 - 添加手势