谈谈 char *num="123";和char num[4]="123";的区别

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

#include<iostream>
#include <string.h>
using namespace std;

void reverse(char *str)
{
    int len=strlen(str);
    char *p=str;
    char *q=str+len-1;
    while(p<q)
    {
        char temp=*p;
        *p=*q;
        *q=temp;
        p++;
        q--;
    }
}
int main()
{
    char *n1="123";
    char n2[4]="456";
    reverse(n1);
    reverse(n2);
    return 0;
}

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

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

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

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

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

    char n1[4]="123";
    n1[0]='1';

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

    char *n2="123";
    n2[0]='1';

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏无题

堆外内存概要

DirectByteBuffer JDK中使用 DirectByteBuffer对象来表示堆外内存,每个 DirectByteBuffer对象在初始化时,都会创...

25740
来自专栏ml

jsp基础知识(基本的语法及原理)

     jsp 语法分为三种不同的类型: (1)  编译器指令: 类如: <%@ page import="java.io.*"%> (2)  脚本语法:  ...

29040
来自专栏达摩兵的技术空间

数组双向绑定的简单分享

本文主要是摘录《vuejs权威指南》部分的相关解读,我们都知道vue对数据支持双向绑定,对数组也是支持的,但是其在官网有明确说明,对于数组通过 对象.语法来修改...

15520
来自专栏李家的小酒馆

Shell入门知识

Shell 简介 Shell作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构...

21200
来自专栏Jackie技术随笔

使用strptime函数时遇到的一个坑

做新专辑排序的需求时,需要对专辑的时间进行排序,由于目前该字段是字符串类型的日期,在排序函数中要转成标准的UNIX时间戳来进行对比,大概代码如下:

32080
来自专栏zhisheng

Windows 64位下安装Redis超详细教程

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(...

440120
来自专栏java一日一条

【Java并发编程】使用wait/notify/notifyAll实现线程间通信的几点重要说明

在 Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信。在线程中调用 wait(...

10430
来自专栏重庆的技术分享区

AngularJs指令解密

17970
来自专栏desperate633

设计模式之代理模式(Proxy模式)代理模式的引入代理模式的实例程序代理模式分析

Proxy是代理人的意思,指的是代替别人进行工作的人。当不一定需要本人亲自去做的工作的时候,就可以寻找代理人去完成。 但在代理模式中,往往是相反的,通常是代理...

10320
来自专栏Java开发者杂谈

JDK1.7新特性(3):java语言动态性之脚本语言API

简要描述:其实在jdk1.6中就引入了支持脚本语言的API。这使得java能够很轻松的调用其他脚本语言。具体API的使用参考下面的代码: 1 package...

312100

扫码关注云+社区

领取腾讯云代金券