当前位置: 首页 > article >正文

C语言中的指针和字符串的赋值

前言:温习下以前学过的C语言知识,温故而知新。

实例说明

本文用一段实例代码阐述指针和字符串的联系。

#include <iostream>
#include <cstring>
int main()
{
	using namespace std;
	char animal[20] = "bear";
	const char * bird = "wren";
	char * ps;
	cout << animal << " and ";
	cout << bird << "\n";
	cout << "Enter a kind of animal: ";
	cin >> animal;
	ps = animal;
	cout << ps << "s!\n";
	cout << "before use strcpy(): \n";
	cout << animal << " at " << (int *)animal << endl;
	cout << ps << " at " << (int *)ps << endl;
	ps = new char[strlen(animal) + 1];
	strcpy(ps, animal);
	cout << "after using strcpy(): \n";
	cout << animal << " at " << (int *)animal << endl;
	cout << ps << " at " << (int *)ps << endl;
	delete[] ps;
	return 0;
};

代码输出:

代码中语句:const char * bird = "wren";以这种方式使用const意味着可以用bird来访问字符串,但不能修改它。

语句:

cout << animal << " and ";
cout << bird << "\n"; 

这两个语句表明:给cout提供一个指针,它将打印地址,但如果指针类型为char*,则cout将显示指向的字符串,此处animal也是一个char类型的地址,在C++中将字符数组名解释为字符数组的首地址。 如果要显示字符串的地址,则必须将这种指针强制转换为另一种指针类型,如*int。因此,ps被现实为fox,而(int *)ps被显示为字符串的地址。

语句:ps = animal;将animal赋给ps并不会复制字符串,而是只复制地址,这样两个指针将指向相同的内存单元。

下面这两条语句是为了获得animal所指向字符串的副本。

ps = new char[strlen(animal) + 1];
strcpy(ps, animal);

语句:ps = new char[strlen(animal) + 1];字符串"fox"不能填满整个animal数组,为了防止浪费不必要的空间,使用strlen()来确定字符串的长度,并将它加1来获得包含空字符时该字符串的长度,随后程序用new来分配刚好足够存储该字符串的空间。

接下来,需要将animal数组中的字符串复制到新分配的空间中。将animal赋给ps是不行的,这样只能修改存储在ps中的地址,从而失去程序访问新分配内存的唯一途径。需要使用库函数strcpy();

strcpy(ps,animal);//copy string to new storage

strcpy()函数接受2个参数。第一个是目标地址,第二个是要复制的字符串的地址,在使用该函数前,需确定ps有足够的空间来存储animal所指向的字符串,所以此处用strlen()来确定所需的空间,并使用new获得可用的内存。通过new和strcpy,获得了fox的两个独立副本。如上图中输出结果中显示的两个不同的字符串地址。 

总结

将字符串复制到数组中,初始化数组时,请使用=操作符。否则请使用strcpy()。

char food[20] = "carrots";
///以下形式也可以
strcpy(food,"flan");

如果在使用strcpy()函数时,要存储的字符串长度超过了字符数组的长度,程序可能会产生未知的错误,这一点需要特别注意。

应使用strcpy()或stmcpy()函数而不是使用赋值操作符来将字符串赋给数组。

 


http://www.kler.cn/a/408422.html

相关文章:

  • Swift 实现查找链表入环点:快慢指针法
  • 渗透测试---shell(7)for循环2与while循环
  • MongoDB比较查询操作符中英对照表及实例详解
  • Ubuntu下的Doxygen+VScode实现C/C++接口文档自动生成
  • mayo介绍和QTqmake编译基于Opencascade开发的mayo工程-小白配置
  • C++注释
  • 3.13MayBeSomeJava that are BUTTON and listener
  • 基于网页的大语言模型聊天机器人
  • java中的最小堆
  • 深入理解 Seata:分布式事务的最佳解决方案
  • Vue.js 学习总结(15)—— 如何快速删除 node_modules 依赖文件
  • springboot实战(17)(“大事件“——新增文章主体逻辑)
  • MySQL的DELETE(删除数据)详解
  • JavaSE 总复习:夯实基础,迈向进阶之路
  • LeetCode 4.寻找两个中序数组的中位数
  • 鸿蒙进阶篇-状态管理之@Provide与@Consume
  • Linux系列-僵尸状态
  • Java基于SpringBoot+Vue的藏区特产销售平台
  • 【创建型设计模式】单例模式
  • flink学习(1)——standalone模式的安装
  • GMAN解读(论文+代码)
  • 【面向对象】Java处理异常的方式
  • STM32抢占优先级不生效
  • 对于相对速度的重新理解 - 插一句
  • MySQL原理简介—10.SQL语句和执行计划
  • 编程中的字节序问题