为什么字符串可以赋值给字符指针变量

本文系转载,对原文的主要几点进行了提炼,想看更详细的内容,请看原帖:
https://blog.csdn.net/yichu5074/article/details/81701850?utm_source=app

char* p = “How are you?”;
这里双引号做了3件事:1.申请了空间(在常量区),存放字符串。2.在字符串尾加了‘\0’。3.返回地址。

指针p接收的就是字符串的地址,而不是字符串本身。似乎问题到这里就解决了,但原文做了更多的扩展解和释,我这里做了提炼(必有不足之处):
1.为什么可以把字符串赋值给字符指针,却不能给字符数组赋值?
char array[] = “apply this function” ; // 这样是可以的,字符数组的初始化

char array[];
array = “apply this function” ; // 这样是不行的
等号的左边必须是一个左值(在程序中占用内存空间,可以修改的量,相当于变量),而数组名代表的是数组首地址,是常量,不可改变的。

2.指针可以自增,而数组不能自增(指针是地址变量,而数组是地址常量)。

3.void指针不能进行指针运算,也不能进行*取值操作(所指向的对象类型不确定)。

4.字符串是常量的情况:把字符串赋值给字符指针变量(不能修改里面的值)。
char* p = “apply this function” ;
p[0] = ‘a’; // 试图修改第一个字符,不会报错,但输出异常

不是常量的情况:把字符串赋值给字符数组(可以修改里面的值)
char array[] = “apply this function” ;
array[0] = ‘a’; // 可以

5.字符常量的类型可以理解为字符常量数组的类型。例如 “abcd" 的类型可以看成 const char[5]

6.数组的类型是由该数组所存放的元素的类型数组本身的大小决定。例如,char s1[4] 和 char s2[5] 。s1的类型是char[4], s2的类型是char[5] 。

7.sizeof()函数是用来求类型的字节数。

8.对于函数参数列表中的以数组类型书写的形式参数,编译器会把其解释为普通的指针类型。如对于 void func(char sa[100],int sc[20],char* p), 则sa的类型为char*,sc的类型为
int*,p的类型为char*。

9.int array[] = {1,2,3,4};
printf("%d\n",sizeof(array));
结果是4,因为array的类型为int[4]

char str[] = “What”;
printf("%d\n",sizeof(str));
其结果为5,因为str的类型是char[5]

char str[10] = “What”;
printf("%d\n",sizeof(str));
其结果为10,因为str的类型是char[10]

char* p = “abcdef”;
printf("%d\n",sizeof§);
其结果为4,因为p的类型是char*(指针是用4个字节存放地址)

10.我们再用一组代码来看指针与数组的区别。

	int inter[] = {
		1,56,78,9,0
	};
	printf("%d\n",&string);
	printf("%d\n",string);
	printf("%d\n",&string[0]);
	
	printf("\n\n");
	
	char* p = "what";
	printf("%d\n",&p);
	printf("%d\n",p);
	printf("%d\n",&p[0]);

其结果为:
在这里插入图片描述
可以看到指针变量p有自己的内存地址。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值