字符指针的一些问题

目录

字符指针 

第一种使用方式

第二种使用方式 

为什么字符指针存储字符串要加const?

笔试题 


字符指针 

在指针的类型中我们知道有一种指针类型为字符指针 char* ;

第一种使用方式

int main()
{
	char ch = 'w'; //字符变量
	char* pc = &ch; //pc指向一个字符变量,pc是个指针变量,pc指向的类型是一个char类型,pc指向ch,ch的类型就是char
}

ch是一个字符变量。

pc指向一个字符变量,pc是个指针变量,pc指向的类型是一个char类型,pc指向ch,ch的类型就是char 。

char是1个字节,pc是四个字节大小应该是ch的四倍

第二种使用方式 

int main()
{
	char* p = "hello world"; //并不是把helloworld放到指针p中去,“hello world”是一个常量字符串,存放在内存的常量区
	//上面表达式的作用是:把常量字符串“hello world”的第一个字符h的地址赋值给p
	printf("%c\n", *p);
	//指向p就相当于指向了所有,因为这个字符串是连续的
	printf("%s", p);
}

上面表达式的作用是:把常量字符串“hello world”的第一个字符h的地址赋值给p,并不是“helloworld”放到指针p中去,“hello world”是一个常量字符串,存放在内存的常量区。

因为p是char类型的,所以对p解引用只能访问到一个字节,所以只存h的地址

指向p就相当于指向了所有,因为这个字符串是连续的

 通过监视我们也可以看出。 

 

为什么字符指针存储字符串要加const?

使用字符指针存字符串的时候我们都会加上const,甚至有些编译器不加const是编译不过的,这是为什么呢?

      原因就是如果直接写是非常不好的,因为"hello world"是常量字符串,是不允许修改的,但这个指针p却没有限制,p是可以随便改的,所以这就非常的危险

eg: 修改之后看似程序通过了,但仔细观察它的代码为-1073741819,这就代表着程序崩溃了

通过监视更直观的看出来

所以建议加上const,这样就可以保证这个指针不能乱修改了

 

笔试题 

对于这样一段代码输出结果是什么呢?

int main()
{
	char str1[] = "hello world.";
	char str2[] = "hello world.";
	char* str3 = "hello world.";
	char* str4 = "hello world.";
	if (str1 == str2)
		printf("str1 and str2 are same\n");
	else
		printf("str1 and str2 are not same\n");

	if (str3 == str4)
		printf("str3 and str4 are same\n");
	else
		printf("str3 and str4 are not same\n");

	return 0;
}

答案: 

 

问题分析及原因:

这里在比较的str1,str2实际上是在比较它们的地址 (因为数组名是首元素的地址) 而不是比较的数组里面的内容。str1和str2这两个字符数组是独立开辟空间的,它俩除了存的东西一样没有任何的关联,这两个空间既然是独立的,str1和str2存的地址肯定就不一样。所以str1和str2也就不相等。

对于str3和str4来说:因为“hello world”是常量字符串,它不能被修改,内容永远是“hello world”。所以如果有多个字符指针存它的时候,这个常量字符串存储的时候只会存储一份,因为这个字符串不能被修改,内容固定,所以多个字符指针都共用这一份就行了,否则就是浪费空间。所以str3指向h的地址,str4也指向h的地址。所以str3和str4相等。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值