函数如何读取指针?

how do functions read pointers?

本文关键字:指针 读取 何读取 函数      更新时间:2023-10-16

>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就不知道内存中第一个字符来自哪里,也无法读取下一个字符。 因此,您可以将取消引用指向字符串(第一个字符(的指针视为丢失有关该字符串的所有信息,但第一个字符除外。

希望这是可以理解的。