字符串数组char[]和字符串指针char*的讨论

来源:互联网 发布:php if else 简写 编辑:程序博客网 时间:2024/05/17 07:39

相同点

1.char *a ,和char a[]在作为形参的时候完全相同。
2.在初始化时,都可以使用常量字符串,

区别

1.内容地址不同

char * a = “abcd”;
此时“abcd”存放在常量区,然后在栈上分配内存给a,并指向“abcd”在常量区的首地址。对于指针本身a来说,它是可变的,允许修改,可以指向其他的地址。但是a所指向的内容为常量,不可以改变它。
char a [] = “abcd”;
此时”abcd”存放在栈上,可以访问和修改,数组名a对应着(而不是指向)一块内存,其地址与容量在生命周期内保持不变,只有数组的内容可以改变。

2.赋值时刻

char * a = “abcd”; 编译时就确定了
char a[] = “abcd”; 运行时确定

3.赋值方式

这个其实是第一条的一个细化
对于字符数组char a[10],a = “i love you”;是不可以的,a代表了首地址,地址是确定的。
对于字符指针char * a, a = “i love you”;是可以的,相当于指向另一个常量的首地址

4.初始化方式

对于字符指针:
1,char * a = “i love you”;
2,char *a; a = “i love you”

对于字符数组:
1,char a[] = “i love you”;

内容复制和比较

数组与数组
char a[] = “hello”;
char b[10];
strcpy(b,a); //而不是b = a;
if(strcmp(b,a) == 0); //不是if(b==a)
指针和数组
int len = strlen(a);
char * p = (char * )malloc(sizeof(char ) *(len +1)) ; //先要申请内存空间,再复制
strcpy(p,a); //不是p = a;
if(strcmp(b,a) == 0);

注意事项

1,字符数组的长度

char str[] = {‘i’, ’ ‘,’l’,’o’,’v’,’e’,’ ‘,’y’,’o’,’u’,’\0’};
char str[] = “i love you”;
是等价的。
但是char str[] = {‘i’, ’ ‘,’l’,’o’,’v’,’e’,’ ‘,’y’,’o’,’u’};就和上面的不同了,因为字符数组并不要求它的最后一个字符为’\0’,两者长度上相差1。

2,sizeof()的不同

对于字符数组char str[10],sizeof(str)等于数组的容量(字节)。
sizeof(str) = 10;
char * p = str;
sizeof(p) = 4;得到是指针p本身的字节数,相当于sizeof(char *)

特别需要注意的是:
当数组作为函数参数传递的时候,数组都作为指针来看待
void fun(char str[100])
{
sizeof(str) = 4;//相当于sizeof(char *)
}

0 0
原创粉丝点击