C语言-字符数组和字符常量指针的区别 (+扩展:单字节字符数组问题 char arr[1])

C语言-字符数组和字符常量指针的区别(+扩展:单字节字符数组 char arr[1])

1. 字符数组和字符常量指针

char a[] = "123";//1 字符数组
char b[] = "123";
char *p = "123"; //2 字符指针
char *q = "123";

1.1 看地址

printf("a===%p\n", a);     //a===0xbfdda024    //%p表示输出a的地址
printf("b===%p\n", b);     //a===0xbfdda018    //不一样
printf("p===%p\n", p);     //p===0x8048839	   //一样
printf("q===%p\n", q);     //q===0x8048839     //一样

结果: 相同的值, 字符数组地址不一样;字符指针一样

1.2 看修改

a[0] = '4'	// 可以
p[0] = '4'	// 错误,编译器不能发现该错误,运行时错误

结果: 字符数组的值可以改变,字符指针的值不可改变

2.总结:

综上所述:

  1. 初始化的字符串数组存储在栈中,可以改变其值。
  2. 初始化的字符串常量指针存储在静态常量区,不能修改其值。

3. 扩展

  1. 字符数组和字符串的最明显的区别就是:字符串会被默认的加上‘\0’结束符;
  2. 字符数组并不要求最后一个字符为’\0’,是否需要加入,完全由系统决定;
  3. 在strcpy() 函数的时候,第二个参数应该是一个字符串常量,因为函数依靠结束符来判定的;

4. 扩展问题:

4.1 代码例子

#include <stdio.h>
#include <string.h>
int main()
{
		int a = 100;
		printf("Hello world %d\n",a);
		char arr0[1];
		memset(arr0,0,sizeof(arr0));
		strcpy(arr0,"123456");
		printf("Hello world arr0=%s\n",arr0);
		char arr[1];
		memset(arr,0,sizeof(arr));
		strcpy(arr,"abcdeeee");
		printf("Hello world arr=%s\n",arr);
		char arr2[1]="2";
		printf("Hello world arr2=%s\n",arr2);
		char arr3[1]="3";
		printf("Hello world arr3=%s\n",arr3);
		char arr4[]="4";
		printf("Hello world arr4=%s\n",arr4);
		printf("%p %p %p %p %p %p\n",&a,arr0,arr,arr2,arr3,arr4);
		return 0;
}

结果:

[root@localhost hello]# ./a.out 
Hello world 100
Hello world arr0=123456
Hello world arr=abcdeeee
Hello world arr2=2abcdeeee
Hello world arr3=32abcdeeee
Hello world arr4=4
0x7ffc2586572c 0x7ffc2586572b 0x7ffc2586572a 0x7ffc25865729 0x7ffc25865728 0x7ffc25865720
[root@localhost hello]# 

4.2 说明:

1. 字符数组并不要求最后一个字符为’\0’,是否需要加入,完全由系统决定;如 arr4 加了 \0
2. 在strcpy() 函数的时候,第二个参数应该是一个字符串常量,因为函数依靠结束符\0来判定的;

综合1 和 2 可知;打印 arr1 arr2 arr3 都有前面的值 因为 之后 eeee后面有\0 才停止
而 arr4 系统添加了 \0 所以只有 4
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值