相同:
都定义一个字符串
不同:
1,含义上的区别:数组对应着一块内存区域,而指针是指向一块内存区域。其地址和容量在生命期里不会改变,只有数组的内容可以改变;而指针却不同,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
看一个例子:
int main()
{
char*arr1="xiao";
char*arr2="liu";
strcpy(arr1,arr2);
printf("%s %s\n",arr1,arr2);
return0;
}
在编译时不会报错,但是在运行时会报错,原因在于企图改变s1的内容,由于s1,s2指向的是常量字符串,其内容是不可修改的,因此在运行时不会通过。
而下面这个程序是可以运行通过的,原因在于数组的内容是可以被修改的:
int main()
{
char arr1[100]="xiao";
char arr2[ ]="liu";
strcpy(arr1,arr2);
printf("%s %s\n",arr1,arr2);
return0;
}
2,计算内存的区别: 用sizeof可以计算出数组的字节数,而用sizeof却无法计算指针所指内存的容量,用sizeof(arr)得到的结果永远是4或者2。在进行参数传递时,数组会自动退化为同类型的指针。
eg: char *str8 = "abcdef\n\0";//7,4
char *str6 = "abcdef\0xyz";//6,4
printf("%d,%d\n",strlen(str8),sizeof(str8));
printf("%d,%d\n",strlen(str6),sizeof(str6));
注:1,char *arr={'l','i','u'}; 会报错!!!!!!!!!!!!!!!
2, "liu"会自动加\0,{'l','i','u'}不会自动加\0
char *arr2="liu"; //4
char arr3[]="liu";//==char arr[]={"liu"}; //4
char arr4[]={'l','i','u'}; //3
char arr5[]={'l','i','u','\0'}; //4
printf("%d\n",sizeof(arr2));
printf("%d\n",sizeof(arr3));
printf("%d\n",sizeof(arr4));
printf("%d\n",sizeof(arr5));