一、本质区别

  char* s是一个保存字符串首地址的指针变量,char a[]是许多连续的内存单元,单元中的元素为char类型。之所以用char *能达到char []的效果,还是字符串的本质,即给你一个字符串地址,便可以随心所欲的操作它。但是,char*和char a[]的本质属性是不一样的。

  当定义 char a[10] 时,编译器会给数组分配十个单元,每个单元的数据类型为字符。而定义 char* s 时,这是个指针变量,只占四个字节,32位,用来保存一个地址,如:

  printf("%p",s);//这个表示 s 的单元中所保存的地址。

  printf("%p",&s);//这个表示变量本身所在内存单元地址。

二、具体分析

例1:

  char *s1 = "hello";

  char s2[100] = "hello";

  //s1指向的内存区域可以改变,而且指向常量字符串时,它的内容是不可以被部分修改的(不能以s1[x]='y'的形式修改,可以以s1[x]的形式来使用,跟数组一样;但整体可以修改,如s1=“dasdasd”就可以)。

  //s2指向的内存区域的地址和容量在生命期里不会改变,但数组里存的内容可以改变。(两者在内存里都在末位存了‘\0’,但strlen()时不计‘\0’。上述s1,s2的strlen()都是5)

  s2=s1;

  //错,s2的地址不能变,即数组不能用等号赋值(除了初始化)

  s1=s2;//对,相当于普通的非数组变量赋值

例2:

   char *s1 和 char s2[]相同的地方(编译器对char[]做了隐式变化):

1)作为形参完全相同,如:

  void function(char *s1);

  void function(char s1[]);

2)只使用不修改,如:

  char *s1="hello";

  char s2[]="hello";

  printf("s1[1]=[%c]\n",s1[1]);  //s1[1]=[e]

  printf("s2[1]=[%c]\n",s2[1]);  //s2[1]=[e]

  printf("s1=[%s]\n",s1);           //s1=[hello]

  printf("s2=[%s]\n",s2);           //s2=[hello]

例3:

  char  str[10] = {"hello world"};

  printf("%s",str);  //用首地址就可以输出字符串,因为在C语言中字符串常量的本质表示其实是一个地址

char  *s ;

s = "hello";

  把一个字符串赋给一个指针变量居然没出错,这是因为c语言中编译器会给字符串常量分配地址,字符串常量的本质表示其实是一个地址。如果"hello"存储在内存中的 0x2000 0x2001 0x2002 0x2003 0x2004 0x2005 。

s = "hello" ,就是把“hello”的首地址给了s,其实真正的意义是 s ="hello" = 0x2000;

我们将“hello”看作是字符串,但是编译器把它看作是地址 0x2000,即字符串常量的本质表现是代表它的第一个字符的地址。

那么 %s ,它的原理其实也是通过字符串首地址输出字符串,printf("%s ", s);   所以,printf("%s",地址);也是等效的。

C/C++ char*、char[]的更多相关文章

  1. const char*、char*、char* const、char[]、string的区别

    1.const char* p: p is a pointer to const char(char const* p 一样)   意思就是不能通过p指针来修改p指向的内容(但是内容可以修改). 2. ...

  2. string、const char*、 char* 、char[]相互转换(待整理)

    string.const char*. char* .char[]相互转换(全) https://blog.csdn.net/rongrongyaofeiqi/article/details/5244 ...

  3. C++ 字符串、string、char *、char[]、const char*的转换和区别

    1.字符串 字符串本质就是一串字符,在C++中大家想到字符串往往第一反应是std::string(后面简称string) 字符串得从C语言说起,string其实是个类,C语言是没有class的,所以C ...

  4. C++中string、char *、char[]的转换

    头段时间有人问过我这个问题,可是我一点头绪都没有,直接说不会.现在从网上找了点资料,看了看,知道点东西了. 一.string转char*. 主要有三种方法可以将str转换为char*类型,分别是:da ...

  5. string、const char*、 char* 、char[]相互转换

    转化总结如下: 目标格式 源格式 string const char* char* char[] string NULL const char*=string.c_str(); const char* ...

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

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

  7. 转载:string、const char*、 char* 、char[]相互转换

    本文转自:https://blog.csdn.net/rongrongyaofeiqi/article/details/52442169 一:转化总结形式如下: 使用时,要对源格式和目标格式进行初始化 ...

  8. Java JNA (四)—— void**、void*、char**、char*、int*等类型映射关系及简单示例

    ByReference类有很多子类,这些类都非常有用. ByteByReference.DoubleByReference.FloatByReference. IntByReference.LongB ...

  9. string 、char* 、 char []的转换

    1.string->char* (1)data string s = "goodbye"; const char* p=str.data(); (2)c_str() stri ...

随机推荐

  1. iOS自己定义返回button(不影响返回手势)

    此方法能够自己定义返回button,且不影响返回手势. 新方法: self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] in ...

  2. 华为云分布式数据库中间件DDM和开源MyCAT对比

    前言 华为云分布式数据库中间件(Distributed Database Middleware)是解决数据库容量.性能瓶颈和分布式扩展问题的中间件服务,提供分库分表.读写分离.弹性扩容等能力,应对海量 ...

  3. HFile存储格式

    Table of Contents HFile存储格式 Block块结构 HFile存储格式 HFile是參照谷歌的SSTable存储格式进行设计的.全部的数据记录都是通过它来完毕持久化,其内部主要採 ...

  4. Write a program that gives count of common characters presented in an array of strings..(or array of

    转自出处 Write a program that gives count of common characters presented in an array of strings..(or arr ...

  5. OpenStack QA

    1 能用devstack部署生产环境的OpenStack吗? 不能,记着,不能!有些选项对生产环境不合适.生产环境能够考虑使用Crowbar部署OpenStack.相关文档例如以下:http://op ...

  6. (一)Java 入门教程

    Java 入门教程 Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言. Java可运行于多个平台,如Windows, Mac OS,及其他多种UNIX版本的系统 ...

  7. iOS开发——高级篇——Runtime实际应用

    前言 本篇主要介绍Runtime在开发中的一些使用场景,顺便讲解了下MJExtension的底层实现 一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制, ...

  8. DNNClassifier 深度神经网络 分类器

    An Example of a DNNClassifier for the Iris dataset. models/premade_estimator.py at master · tensorfl ...

  9. Swing手动进行最大化最小化

    首先jdk的setExtendedState是有bug的,需要先重载JFrame的setExtendedState方法 /** * Fix the bug "jframe undecorat ...

  10. iOS 证书详解

    引言 关于开发证书配置(Certificates & Identifiers & Provisioning Profiles),相信做iOS开发的同学没少被折腾.对于一个iOS开发小白 ...