我是C++的新手,正在尝试将字符串转换为整数。我使用的是atoi,但有一些限制,所以我开始使用strtol,它工作得很好。然而,我想了解更多关于*temp和&temp的信息(我使用了谷歌,并了解到这是一个临时的存储空间),但我想了解它们的区别以及何时使用它们。
char *temp;
int m = strtol (argv[1],&temp,10);
if (*temp != '\0')发布于 2020-02-09 17:35:00
*temp是指向名为temp的变量的指针,&temp获取该变量的地址
发布于 2020-02-09 18:16:58
首先,jessycaaaa欢迎来到Stackoverflow。
我是C++的新手,正在尝试将字符串转换为整数。
对我来说,这看起来像是普通的C代码。不过,您可以使用C++编译器对其进行编译。
我使用的是
,但有一些限制,所以我开始使用strtol,它工作得很好。
因为当argv[1]包含不同于数字的内容时,使用atoi会得到未定义的行为,所以strtol是一种可行的方法。如果您与我们分享更多的代码,我们将帮助您更好地解决您的问题。
然而,我想了解更多关于*temp和&temp (我有谷歌,并了解到它是一个临时存储空间),但想要了解区别和何时使用哪一个。
首先,您必须区分使用和声明
char *temp;
在这里,您声明了(声明中的*符号) char类型的名为temp的指针。指针是一个变量,它存储内存地址(它所指向的地址)。这里您没有定义一个地址,所以它很可能指向一个随机空间,但是
int m= strtol (argv1,&temp,10);
将指针的地址(&-symbol、use-case、address-of操作符)传递给strtol,这样就可以得到一个指向argv[1]中数字文字结尾部分的地址。该函数还以long形式返回读取的字符串的数值,并将其转换为int。
if (*temp != '\0')
在这里你可以访问地址指向的值(*-符号,用例,解引用操作符)。通常将\0设置为以null结尾的字符串的指示。因此,您正在询问之前读取的结束部分是否具有空终止字符。
你知道吗:在C++中,使用stringstreams有更好的方式来实现这一点:
std::stringstream
如果你不想在C中处理太多的字符串操作和指针带来的麻烦,这只是一个想法。
另外,我会读一本关于C语言的好书(不是C++)。C++也有references,不要被这些搞糊涂了。如果你掌握了C的指针概念,我敢肯定其他的一切对你来说都会非常清晰。
诚挚的问候
发布于 2020-02-09 18:52:39
*和&是新接触C和C++的程序员必须克服的第一个障碍。
为了真正理解这些概念,更多地了解内存在这些语言中的工作原理是有帮助的。
首先: C++只是一个C语言,但是有类和许多其他的附加特性。几乎所有的C程序都是有效的C++程序。C++一开始甚至是一种先编译成C的语言。
粗略地说,内存分为两个部分,一个“栈”和一个“堆”。还有其他地方可以存放代码本身和编译时常量(可能还有更多)等等,但目前这并不重要。在函数中声明的变量总是存在于堆栈中。让我们通过一个简单的例子来看看这一点,并分析记忆是如何组织起来的,以构建一个心理模型。
#include <iostream>
void MyFunction() {
int intOnStack = 5;
int* intPtrOnStack = new int(6); // This int pointer points to an int on the heap
std::cout << intOnStack << *intPtrOnStack;
delete intPtrOnStack;
}
int main() { MyFunction(); }这个程序在执行时打印56。那么当调用MyFunction()时会发生什么呢?首先,堆栈的一部分保留给此函数使用。当在函数中声明变量intOnStack时,它被放在堆栈的这一部分,并用int值5初始化(填充)。
接下来,声明变量intPtrOnStack。intPtrOnStack的类型为int*。int*通过包含它们的内存地址指向int的内存地址。所以一个int*被放在堆栈上,并用表达式new int(6)产生的值进行初始化。这个表达式在堆上创建一个新的int,并将这个int (一个int*)的内存地址返回给它。所以这意味着intPtrOnStack现在指向堆上的int。尽管指针本身位于堆栈上。
堆是内存的一部分,由程序中的所有函数和对象“共享”。堆栈不是这样的,每个函数都有自己的堆栈部分,当函数结束时,它的堆栈部分就会被释放。
所以int*只是int的内存地址。int在哪里并不重要。int*也可以指向堆栈上的int:
#include <iostream>
void MyFunction() {
int intOnStack = 5;
int* intPtrOnStack = &intOnStack; // This int pointer points to intOnStack
std::cout << intOnStack << *intPtrOnStack;
}
int main() { MyFunction(); }这将打印55。在本例中,我们还可以看到&-operator的实际应用( &有几种用法,如位--我不再赘述)。
&只返回内存地址(一个指针!)它的运算数。在本例中,它的操作数为intOnStack,因此它返回其内存地址并将其分配给intPtrOnStack。
到目前为止,我们只看到int*作为指针类型,但是对于每种类型的具有内存地址的对象,都存在指针类型,包括指针。这意味着像int**这样的东西是存在的,它的意思就是“指向int的指针”。你怎么才能得到一个呢?像这样:&intPtrOnStack。
指针只能驻留在堆栈上吗?否:new int*(&intPtrOnStack)。或者new int*(new int(5))。
https://stackoverflow.com/questions/60135104
复制相似问题