欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

char s[] 和 char *s 的区别

发布时间:2025/6/15 编程问答 32 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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.作为形参完全相同
例:

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 s[] 和 char *s 的区别的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。