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;//声明一个字符串指针sp

sp = 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;//声明一个字符串指针p

p=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]

 

  • 18
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏波.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值