`
duanhengbin
  • 浏览: 384665 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

char *s 和 char s[] 的区别小结

阅读更多

最近的项目中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误。一时也不能说得很明白,网上也搜了一下相关文章发现一些写的比较好的,综合了一下当教育资料备用。

 

char *s1 = "hello";
char s2[] = "hello";

 

【区别所在】

char *s1 的s1,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
char s2[]的s2 是数组对应着一块内存区域,其地址和容量在生命期里不会改变,只有数组的内容可以改变

 

【内存模型】
       +-----+     +---+---+---+---+---+---+
   s1: |  *======> | h | e | l | l | o |\0 |
       +-----+     +---+---+---+---+---+---+
       +---+---+---+---+---+---+
   s2: | h | e | l | l | o |\0 |
       +---+---+---+---+---+---+

 

场景一)
char *s1 = "hello";
char s2[] = "hello";
s2=s1;  //编译ERROR
s1=s2;  //OK

 

分析:s2其地址和容量在生命期里不能改变

 

场景二)
char s2[] = "hello";
char *s1 = s2;  //编译器做了隐式的转换 实际为&s2

char *s1 = &s2;

 

分析:以上两个指针复值完全等价,由于编译器会做这个隐式转换也容易导致初学者误认为 char *s 与char s[]是一回事。
      另用第二种在一些编译器甚至会报警告信息。

 

场景三)
char *s1 = "hello";
char s2[] = "hello";
s1[0]='a';  //×运行ERROR( 这一句好像在一些的编译器不会出错,原因待查)
s2[0]='a';  //OK

 

分析:运行时会报错,原因在于企图改变s1的内容,由于s1指向的是常量字符串,其内容是不可修改的,因此在运行时不会通过。而s2指向的是变量区字符串,可以修改。

 

场景四)
让我们来给一个指针的指针赋值,在使用某些含char**参数的函数时会用到,场景二的增强版。
    char *s1="hello";
    char s2[]="hello";
    char *s3=s2;       //★注意这句必须要★
    char **s4=&s3;   //s2(char[])要用两步才能完成赋值
    char **s5=&s1;   //s1(char*) 只需一步
    printf("s4=[%s]\n",*s4);//打印结果:s4=[hello]
    printf("s5=[%s]\n",*s5);//打印结果:s5=[hello]

 

分析:这个例子应当说最能反映出char *与char []的差异,但是由于使用场合不多,新人尤其需要注意。

 

下面是一些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]

分享到:
评论

相关推荐

    C++各种字符串类型之间进行转换

    小结 在C++中,字符串类型之间的转换是经常需要的操作。不同的转换方法可能会涉及不同的库函数,因此需要根据实际情况选择合适的转换方式。本文介绍了几种常见的字符串类型及其之间的转换方法,希望能够帮助读者更...

    strstr和strcpy函数实现

    #### 五、小结 本文介绍了`strstr`和`strcpy`两个字符串处理函数的基本概念及其实现方式。通过这些函数的学习,可以更好地理解字符串操作的基础知识,对于日常编程工作非常有帮助。需要注意的是,虽然上述示例代码...

    sscanf,sprintf,fscanf,fprintf 系列函数的用法小结 doc

    ### sscanf,sprintf,fscanf,fprintf 系列函数的用法小结 #### 1. sscanf函数 **函数原型:** ```c int sscanf(const char *str, const char *format, ...); ``` **功能说明:** `sscanf`函数类似于`scanf`,...

    MFC_CString_用法小结

    ### MFCCString用法小结 #### 一、初始化方法 `CString` 是 MFC (Microsoft Foundation Classes) 中用于处理字符串的一个重要类。它提供了一系列的功能来帮助开发者更方便地处理字符串相关的操作。 ##### 1. 直接...

    堆跟栈的分析

    #### 小结 1. **栈分配的优点**:速度快、自动管理;缺点是空间有限且不能动态扩展。 2. **堆分配的优点**:灵活、空间大;缺点是需要程序员手动管理,容易出现内存泄漏等问题。 通过对比分析,我们可以更加深刻地...

    C语言全书word版CHAR10

    使用*和变量类型来定义一个指针,如`int *p;`表示`p`是一个指向整型变量的指针。 10.2.2 指针变量的引用 使用`&`运算符获取变量的地址,如`int a = 10; int *p = &a;`将`a`的地址赋值给指针`p`。 10.2.3 指针变量...

    PLSQL开发笔记和小结.doc

    ### PLSQL开发笔记和小结 #### PLSQL基本结构 ##### 基本数据类型变量 在PL/SQL中,为了有效地处理数据,提供了一系列基本数据类型,这些类型大致可以分为数字类型、字符类型和日期类型。 - **Number数字型**:...

    谭浩强 C语言 CHAR09

    #### 9.5 本章小结 本章主要介绍了C语言中预处理命令的基本概念和使用方法,包括宏定义、文件包含和条件编译等。正确使用预处理命令可以帮助提高程序的可读性和可维护性,同时也能简化代码的管理和组织。

    C字符串操作函数实现方法小结

    其原型为`size_t strlen(const char *s)`,返回`s`指向的字符串的长度(不包括结束的空字符`\0`)。实现中,通过一个计数器`iLen`,遍历字符串直到遇到空字符`\0`,返回计数器的值。 6. `strcmp`函数: `strcmp`...

    C语言中qsort函数用法实例小结

    C语言中的`qsort`函数是用于对内存块中的元素进行排序的标准库函数,它包含在`<stdlib.h>`头文件中。`qsort`函数的使用非常灵活,可以...熟练掌握`qsort`函数的使用,能极大地提高C语言编程的效率和代码的可复用性。

    c语言文件读写操作代码.pdf

    #### 四、小结 本文详细介绍了C语言中进行文件读写的常用函数及其用法,这些函数可以帮助开发者高效地处理文件操作任务。掌握这些函数是学习C语言的重要一步,也是成为一名合格程序员的必备技能之一。希望本文能对...

    在C语言中,文件读写操作通常使用标准库中的fopen(), fclose(), fgets(), fputs(), fscanf

    #### 四、小结 本文详细介绍了C语言中用于文件读写的六个关键函数:`fopen()`、`fclose()`、`fgets()`、`fputs()`、`fscanf()`和`fprintf()`,并通过三个示例来具体说明这些函数的实际应用。掌握这些函数能够使...

    C语言界面编程小结

    ### C语言界面编程小结 #### 一、引言 在计算机编程领域,用户界面(User Interface, UI)设计是连接用户与程序之间的桥梁。对于使用C语言进行开发的程序员而言,掌握界面编程技术是非常重要的。本文将从C语言界面...

    Log函数总结

    #### 六、小结 本文介绍了C语言中使用`fscanf`读取文件的方法以及如何自定义日志打印函数。同时,还深入探讨了`fopen`和`fprintf`函数的用法及其参数配置,这对于理解和掌握C语言中的文件操作非常有帮助。在实际...

    c指针总结SHJ

    #### 小结 1. **指针的概念**: - 指针是一种特殊的变量,它存储的是其他变量或数据结构的地址。 - 不同类型的指针用于处理不同类型的数据。 - 指针的使用使得程序更加灵活高效。 2. **指针的使用**: - 通过...

    指针小结.txt

    ### 指针小结:理解与应用 在计算机编程领域,尤其是C语言中,指针是一个极其重要的概念。指针让数据结构和算法的设计变得更为灵活和高效,但同时也因其复杂性和潜在的危险性而令许多初学者感到畏惧。本文将深入...

Global site tag (gtag.js) - Google Analytics