首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++中的temp和*temp

c++中的temp和*temp
EN

Stack Overflow用户
提问于 2020-02-09 17:20:55
回答 3查看 4K关注 0票数 0

我是C++的新手,正在尝试将字符串转换为整数。我使用的是atoi,但有一些限制,所以我开始使用strtol,它工作得很好。然而,我想了解更多关于*temp&temp的信息(我使用了谷歌,并了解到这是一个临时的存储空间),但我想了解它们的区别以及何时使用它们。

代码语言:javascript
复制
char *temp;
int m = strtol (argv[1],&temp,10);
if (*temp != '\0')
EN

回答 3

Stack Overflow用户

发布于 2020-02-09 17:35:00

*temp是指向名为temp的变量的指针,&temp获取该变量的地址

票数 0
EN

Stack Overflow用户

发布于 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的指针概念,我敢肯定其他的一切对你来说都会非常清晰。

诚挚的问候

票数 0
EN

Stack Overflow用户

发布于 2020-02-09 18:52:39

*&是新接触C和C++的程序员必须克服的第一个障碍。

为了真正理解这些概念,更多地了解内存在这些语言中的工作原理是有帮助的。

首先: C++只是一个C语言,但是有类和许多其他的附加特性。几乎所有的C程序都是有效的C++程序。C++一开始甚至是一种先编译成C的语言。

粗略地说,内存分为两个部分,一个“栈”和一个“堆”。还有其他地方可以存放代码本身和编译时常量(可能还有更多)等等,但目前这并不重要。在函数中声明的变量总是存在于堆栈中。让我们通过一个简单的例子来看看这一点,并分析记忆是如何组织起来的,以构建一个心理模型。

代码语言:javascript
复制
#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时,它被放在堆栈的这一部分,并用int5初始化(填充)。

接下来,声明变量intPtrOnStackintPtrOnStack的类型为int*int*通过包含它们的内存地址指向int的内存地址。所以一个int*被放在堆栈上,并用表达式new int(6)产生的值进行初始化。这个表达式在堆上创建一个新的int,并将这个int (一个int*)的内存地址返回给它。所以这意味着intPtrOnStack现在指向堆上的int。尽管指针本身位于堆栈上。

堆是内存的一部分,由程序中的所有函数和对象“共享”。堆栈不是这样的,每个函数都有自己的堆栈部分,当函数结束时,它的堆栈部分就会被释放。

所以int*只是int的内存地址。int在哪里并不重要。int*也可以指向堆栈上的int

代码语言:javascript
复制
#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))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60135104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档