函数如何读取指针?
how do functions read pointers?
>im 是 C++ 的新手。我使用类制作了这个简单的程序,这些类可以执行简单的事情,例如更改对象的实例和复制对象。
但是我很困惑像std::strlen()
这样的函数如何读取指针。据我所知,指针只是另一个变量的地址。如果我传入去引用的指针std::strlen(*c)
我会收到一些错误,说编译器无法将指针转换为字符,但是如果我传入原始指针,就像std::strlen(c)
代码编译良好,并提供所需的输出。为什么?std::strlen()
应该知道计算长度的确切字符串吗?传递指针有什么帮助?
strcpy_s()
也是如此,如果我传入像这样的去反射指针strcpy_s(*str,strlen(str)+1,*c)
它不起作用,但如果我传入像strcpy_s(str,strlen(str) + 1, c)
这样的指针,它会完美地工作。
请帮助我,因为我真的很困惑。谢谢
这是代码-
#include <iostream>
#include <cstring>
#include <vector>
class mystring
{
char* str;
public:
//constructors
mystring();
mystring(const char* c);
mystring(const mystring& original);
~mystring();
//methods
void display() const;
void length() const;
void display_vector(const std::vector <mystring>& thing) const;
//operator overloading
mystring& operator= (const mystring& source);
};
mystring::mystring() //default constructor
:str(nullptr)
{
str = new char[1];
*str = ' ';
}
mystring::mystring(const char* c) //overloded constructor (char *c)
{
str = new char[std::strlen(c) + 1];
strcpy_s(str, std::strlen(c) + 1, c);
}
mystring::mystring(const mystring& original) // copy constructor
{
str = new char[strlen(original.str) + 1];
strcpy_s(str, strlen(original.str) + 1, original.str);
}
mystring::~mystring() //destructor
{
delete[] str;
}
void mystring::display() const // display method for mystring
{
std::cout << str << std::endl;
}
void mystring::length() const // length fuc
{
std::cout << strlen(str) << std::endl;
}
mystring& mystring::operator= (const mystring& source) //= operator overload
{
delete[] this->str;
this->str = new char[std::strlen(source.str) + 1];
strcpy_s(this->str, std::strlen(source.str) + 1, source.str);
return *this;
}
int main()
{
mystring v{ "v_and_jackie" };
v.display();
mystring jackie;
jackie = v;
jackie.display();
std::vector <mystring> thing;
thing.push_back("wake up");
thing.push_back("samurai");
for (const auto i : thing)
i.display();
}
再次感谢。
std::strlen
接收指向字符串开头的指针作为参数:
std::size_t strlen( const char* str );
返回给定字节字符串的长度,即字符数组中第一个元素指向的字符数,其第一个元素指向
str
,不包括第一个 null 字符。如果str
指向的字符数组中没有空字符,则行为未定义。
https://en.cppreference.com/w/cpp/string/byte/strlen
据我所知,指针只是另一个变量的地址
正确。
如果我在 std::strlen(*c( 中传入去引用指针,我会收到一些错误,说编译器无法将指针转换为字符
再次阅读消息。应该说它不能将字符转换为指向字符的指针。
但是如果我传入像 std::strlen(c( 这样的原始指针,代码编译良好并给出所需的输出。为什么?
这是因为C++语言具有类型安全性。std::strlen
接受作为指向字符的指针的参数。如果你向函数传递的东西不是指向 char 的指针,也不是可转换为此类指针的东西,例如 char 对象,那么程序的格式不正确,您将收到一条信息性消息,指出您的错误。
当您间接通过指针时,您返回的不是相同类型的指针。相反,您返回的值是指向的对象,它始终具有不同的类型。在指向字符的情况下,指向的对象是字符。
传递指针有何帮助?
将正确类型的参数传递到函数调用中会有所帮助。
我将尝试解释为什么您必须传递字符的原因:
回到过去,记忆是非常宝贵的。而不是使用整数的内存来跟踪字符串长度,而是使用约定:以空字节(零(结束字符串。
每个字符都以 ASCII 格式保存(查找 ASCII 表(。 因为每个字符串都以 null 结尾"Hello"
所以看起来像内存中的{72, 101, 108, 108, 111, 0}
。
因此,要获取字符串的长度,您需要一个指向第一个字符的指针,然后向前前进,直到到达空字节。通过计算您在内存中前进的字节数,您可以知道字符串中包含的字符数。
这正是strlen
所做的。
通过取消引用指向第一个字符的指针,您可以获得第一个字符。 这样strlen
就不知道内存中第一个字符来自哪里,也无法读取下一个字符。 因此,您可以将取消引用指向字符串(第一个字符(的指针视为丢失有关该字符串的所有信息,但第一个字符除外。
希望这是可以理解的。
- 分段错误 - 读取初始化指针的数组
- 函数如何读取指针?
- 通过指针读取文件
- 如何读取指针的值,因为这个指针是函数的返回?
- 尝试通过共享指针使用变量时读取访问冲突
- 如何使用指针直接从托管代码中的非托管代码中读取矢量数据
- 为什么不读取带有指针的结构?
- C++指针将内存读取为 0
- 使用智能指针读取访问冲突
- 从字节指针读取位的差异
- 通过具有矢量基址的指针读取矢量元素时出错
- 在Linux中,多个进程使用文件指针读取文件时使用的共享虚拟内存
- 尝试从插入的.dll中的指针读取字符串时出现Segfault
- 使用指向成员的指针读取 cons 对象的字段的值
- 有关要从结构指针读取的代码的简单代码
- 如何使用指针读取 nxn 矩阵
- 从无效指针读取--relpret_cast可以
- 从指针读取一个容器结构
- 通过指针读取多维数组或向量安全吗
- 如何从指针读取字节序列C++一样长