对于char *s1 和 char s2[] 的认识

对于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]

对于char *s1 和 char s2[] 的认识

时间: 2024-07-31 12:13:59

对于char *s1 和 char s2[] 的认识的相关文章

strncpy(char* s1,const char *s2,int n) 和 strchr(cosnt char *s,char c)

1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char s1[10] = "abcd"; 6 char s2[10] = "ABCDEF"; 7 printf("s1 = %s\ns2 = %s\n",s1,s2); 8 strncpy(s1,s2,3); 9 printf("s1 = %s\ns2 = %s\n",s1,s2);

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

目前中有不少c的程序,在与项目新成员的交流中发现,普遍对于char *s1 和 char s2[] 认识有误区(认为无区别),导致有时出现“难以理解”的错误.一时也不能说得很明白,网上也搜了一下相关文章发现一些写的比较好的,综合了一下当教育资料备用. char *s1 = "hello";char s2[] = "hello"; [区别所在] char *s1 的s1,而指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容

深入理解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种组合 (0)程序 在执行时为其开辟的空间皆在内存(RAM)中,而RAM里的内存单元是可读可写 的:指针只是用来指定或定位要操作的数据的工具,只是用来读写RAM里内存单元的工作指针 .若对指针不加任何限定,程序中一个指针可以指向RAM中的任意位置(除了系统敏感区,如操作系统内核所在区域)并对其指向的内存单元进行读和写

char *s 与char s[]的区别

可能有些人不会注意二者的区别,举几个例子说明下. char s1[] = "hello";     //定义一个字符数组 char *s2 = "hello";     //定义一个指向字符串常量"hello"的指针 在这里,s1 = &s1[0], s1是个"常量",始终等于&s1[0],无法更改.s2是个指针变量. #include <iostream> #include <cstdio&

实现 reverse(const char *s1 , char *s2)

题目: 将字符串s1的内容反转后输出到s2,比如s1="12345678",则输出s2为"87654321",实现语言选择一种即可.  C语言实现时要求不能使用包括strlen在内的任何库函数,也不能定义和使用除s1.s2以外的其它变量.使用如下原型的C函数void reverse(const char *s1, char *s2); 总结: 如果是定义的字符串常量的话,默认类型是const类型的,也就说是如果我们把字符传直接传进去,类型是const,也就是无法修改

char* str=&quot;bbo&quot;;char s1[]=&quot;bbo&quot;的区别

;表达式运算得到的结果是常量值(不可写),常量是没有内存空间的编译的时候就会把常量放到常量区,以后不能修改 字符串是字符串常量,字符是字符常量(修改),看到的能修改的都是已经从常量区放到寄存器,在mov到变量中了所以能修改 char* str="helloworld";char s1[]="bbo"的区别 int main(int argc, char* argv[]){ int a=1; char* str="bbo"; *str='m';//

char c[]和char *c

首先需知道程序所占用的内存的分区形式: eg://main.cpp int a=0;   //全局初始化区 char *p1; //全局未初始化区 main () { int b;//栈 char s[]="abc"; //栈 char *p2;  //栈 static int c=0;//全局静态初始化区 p1=(char*)malloc(10); p2=(char*)malloc(20);//分配得来的10和20字节的区域在堆区 strcpy(p1,"123456&quo

char *p 与char p[] 比较

所有的字符窜常量都被放在静态内存区 因为字符串常量很少需要修改,放在静态内存区会提高效率 例: char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char *str5 = "abc"; const char *str6 = "abc";

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

先说些题外话,今天学习execve(2)的使用,由于书上代码使用的是C89标准,所以下面这种代码都被我修改了 char* s[] = { "aaa", "bbb", "cc" }; 也就是在char前面加个const,因为"aaa"."bbb"."cc"都是字符串字面值(string literal),在C++标准中string literal只能转换成const char*,原因是即使