char *arr与char a[ ]

相同:

都定义一个字符串

不同:

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));

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值