C++指针与其它复合类型

简介: C++指针与其它复合类型

前言:


 指针我们已经知道如何使用了,也知道指针和数组配合起来使用,这次我们来讲讲指针与字符串,以及指针和动态结构的一些知识。


1.指针与字符串

1.1cout接收char类型的地址的反应


 我们知道字符数组的数组名是首字符的地址,当我们用cout工具来显示字符数组里的字符串的时候,无疑是把首地址传给cout了。cout将顺着这个地址依次往下打印,当它遇到字符串的结束标志时,就停下来不打印了。


 所以我们就知道,cout在打印字符串的时候,接收的是一个字符的地址,并认为我们是要它打印一个字符串,为了与cout对字符串输出的处理保持一致,引号括起来的字符串也应当是一个地址。


1.2字符串字面值

 

双引号括起来的字符串是常量字符串,是一个不能被修改的值,一般出现在用字符指针来接收常量字符串的首字符地址。但我们知道,字符串还可以给字符数组初始化,但内容可以被修改,大家注意区分。


 对bird指针进行const修饰,使得代码更加健壮,当发现错误时,主动抛出错误。


 对指向常量字符串的字符指针进行输入是错误的:


有些编译器将字符串字面值视为只读常量,如果修改了它们,编译器将会报错。在C++中,字符串字面值都被视为常量,而有一些编译器并没有改过来,仍可以对其进行修改。

有些编译器只使用一个字符串字面值副本来为程序使用。

 补充:C++不能保证字符串字面值被唯一得存储。


1.3字符串备份

 


 怎么将一个字符串给存起来呢?首先我们可以想到用数组,但这个数组如果是静态的话缺点很多,所以我们考虑用new创建一个动态数组,将其地址返回个一个字符指针管理更好。


 在C++中strlen、strcpy的头文件是<cstring>,使用方法和C语言里的一样。


 这里还需要首的一点就是在开辟动态数组时,元素个数的确定+1的问题。因为我们计算字符串长度的时候,空字符是不算内容的,但表示一个字符串,结尾必须有空字符,我们加上这个单位空间,就是给空字符留的。


2.使用new创建动态结构

创建动态结构和前面的都很相似,我注释里说明清楚啦,这里就不再赘述啦。


 关于为动态结构成员赋值,我们需要使用cin和cin.get()工具分别为变量和字符数组赋值,这一点很重要。可不敢直接像C一样p->name = "张三";如果不是很懂cin.get()请跳转:


链接:《认识C++字符串符合类型》


 而如何访问到结构成员呢?首先p是一个指向结构体的指针,指针通过箭头操作符可以轻松访问到结构体成员。这里读者可能也很好奇,为啥没有结构名称的结构体可以通过(*p).成员名来访问。博主经过一番学习,总结经验,认为是因为内存单元是唯一性的原因。我们知道,两个没有名称的结构体,即使成员一模一样,在声明类型的时候创建出来的变量也会被认为是不同类型的结构体变量。这正是因为两个变量的存储地址不同呀。虽然有名称的结构体创建的变量也不在同一个存储位置上,但它们是由相同名称创建出来的。说这个原因是,因为计算机在对没有名称的结构体进行操作时,可以用(*指针).结构体成员,是因为,类型是独立的,计算机认得这块空间里放得是什么东西。


3.使用new和delete搭配存储键盘输入的字符串

当我们想将输入的字符串内容放到一个开辟在堆区的数组中,可以使用new来实现。


 可能读者不太理解这么做的意义在哪,博主解释一下。我们在以往输入一个字符串到一个动态数组的时候,是不是事前还要确定动态数组要开辟多大的空间,我们需要决定元素个数。但在这里,我们先是用了一个较大的静态数组接收我们输入的字符串(保证接收的下),然后用字符串备份的方式,开辟一个合理的数组大小,并将其地址返回去。而getname()函数内部的局部变量pn和数组都销毁掉了,没有浪费空间。


 最后的结果就相当于将键盘输入的字符串放到一个大小恰好不过的数组里面去了。


 好啦,今天的指针内容就到这告一段落啦。后面还有一些细碎的指针知识,我们以后遇到就写出来,进入下一篇章。


 希望读者读完有所收获,如果文章有误的地方,请读者留言至评论区下方,博主看到及时更改。


 求点赞,求点赞,求点赞!

相关文章
|
16天前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
18 1
|
17天前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
20 2
|
26天前
|
存储 编译器 程序员
C++类型参数化
【10月更文挑战第1天】在 C++ 中,模板是实现类型参数化的主要工具,用于编写能处理多种数据类型的代码。模板分为函数模板和类模板。函数模板以 `template` 关键字定义,允许使用任意类型参数 `T`,并在调用时自动推导具体类型。类模板则定义泛型类,如动态数组,可在实例化时指定具体类型。模板还支持特化,为特定类型提供定制实现。模板在编译时实例化,需放置在头文件中以确保编译器可见。
26 11
|
19天前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
19天前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
|
24天前
|
存储 C++ 索引
C++函数指针详解
【10月更文挑战第3天】本文介绍了C++中的函数指针概念、定义与应用。函数指针是一种指向函数的特殊指针,其类型取决于函数的返回值与参数类型。定义函数指针需指定返回类型和参数列表,如 `int (*funcPtr)(int, int);`。通过赋值函数名给指针,即可调用该函数,支持两种调用格式:`(*funcPtr)(参数)` 和 `funcPtr(参数)`。函数指针还可作为参数传递给其他函数,增强程序灵活性。此外,也可创建函数指针数组,存储多个函数指针。
|
1月前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
27 3
|
18天前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
19天前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
1月前
|
C++
C++(十八)Smart Pointer 智能指针简介
智能指针是C++中用于管理动态分配内存的一种机制,通过自动释放不再使用的内存来防止内存泄漏。`auto_ptr`是早期的一种实现,但已被`shared_ptr`和`weak_ptr`取代。这些智能指针基于RAII(Resource Acquisition Is Initialization)原则,即资源获取即初始化。RAII确保对象在其生命周期结束时自动释放资源。通过重载`*`和`-&gt;`运算符,可以方便地访问和操作智能指针所指向的对象。