char s[] 和 char *s 的区别
第一种:
char *a 与char a[] 的区别
char *d = "hello" 中的a是指向第一个字符‘a'的一个指针;char s[20] = "hello" 中数组名a也是执行数组第一个字符'h'的指针。现执行下列操作:strcat(d, s)。把字符串加到指针所指的字串上去,出现段错误,本质原因:*d="0123456789"存放在常量区,是无法修的。而数组是存放在栈中,是可以修改的。两者区别如下:
(1)读写能力:char *a = "abcd"此时"abcd"存放在常量区。通过指针只可以访问字符串常量,而不可以改变它。而char a[20] = "abcd"; 此时 "abcd"存放在栈。可以通过指针去访问和修改数组内容。
(2)赋值时刻:char *a = "abcd"是在编译时就确定了(因为为常量)。而char a[20] = "abcd"; 在运行时确定.
(3)存取效率:char *a = "abcd"; 存于静态存储区。在栈上的数组比指针所指向字符串快。因此慢,而char a[20] = "abcd"存于栈上,快。
另外注意:char a[] = "01234",虽然没有指明字符串的长度,但是此时系统已经开好了,就是大小为6-----'0' '1' '2' '3' '4' '5' '\0',(注意strlen(a)是不计'\0')
第二种:
char s[] 和 char *s 的区别
之前自己写代码碰到 char s[];和char *s 的各种方面总是搞不清楚,知道他们是不一样的,但因为将他们打印出来有都是 相同的地址所以一直懵逼,今天特地网上整理了下,将他们彻底搞定
不同点:
1.在声明时
char *s1="hello";//声明一个指针指向常量"hello" char s2[]="hello";//在栈中开辟一个数组字符"hello"; /** s2[]="hello" 相当于 * char s2[6]; * s2[0]='h'; * s2[1]='e'; * s2[2]='l'; * s2[3]='l'; * s2[4]='0'; * s2[5]='\0'; **/说明:
s1内容不能修改,因为他指向常量 s2内容可以修改,因为他指代内存中的变量区 s2其地址和容量在生命期里不能改变
2.使用时
char str[255];//声明一个字符数组str占255个字节 char *p;//声明一个字符串指针p char *sp;//声明一个字符串指针spsp = str;/**实际上是 sp=&str; 编译器做过处理**/ //需要有一个指针来保存原先地址 p=sp; *(sp++)='1'; *(sp++)='2'; *sp++='3';//相当于*(sp++) *sp++='4'; *sp++='5'; *sp='\0'; printf("%s\n",p);printf("%p\n",p); printf("%p\n",&str); printf("%p\n",sp-5); printf("%s\n",(sp-5));//等同于=============================================== int i=0; char str[255];//声明一个字符数组str占255个字节 char *p;//声明一个字符串指针pp=str; str[i++]='1'; str[i++]='2'; str[i++]='3'; str[i++]='4'; str[i++]='5'; str[i]='\0';printf("%s\n",p); printf("%p\n",p);说明:
char str[] 实际是一个(字符数组)指针,不是(字符)指针 char str[] 不是一个真实意义(声明的)的指针类型,不能进行正常指针的加减计算操作 char *p是一个指针类型可以进行计算操作
相同点:
1.作为形参完全相同
例:
2.只读取不修改的时候
例:
总结
以上是生活随笔为你收集整理的char s[] 和 char *s 的区别的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 如何将字符数组里的内容转换成uint8的
- 下一篇: 关于STM32驱动DS1302实时时钟的