int*变量还是int变量 我在C++中工作,最近一直在使用指针。我发现有几种方法可以初始化我需要使用的内存块 void functioncall(int* i) { *i = *i + 1; } int main(){ int* a = (int*)malloc(sizeof(int)); int az = 0; functioncall(a); functioncall(&az); }

int*变量还是int变量 我在C++中工作,最近一直在使用指针。我发现有几种方法可以初始化我需要使用的内存块 void functioncall(int* i) { *i = *i + 1; } int main(){ int* a = (int*)malloc(sizeof(int)); int az = 0; functioncall(a); functioncall(&az); },c++,pointers,coding-style,C++,Pointers,Coding Style,注意,第一个变量int*a被声明为指针,然后我为它调用内存。但是,对于az,它不是指针,而是在调用函数时,我得到内存的地址 所以,我的问题是:是否有一种更可取的方式=,或者一种方式比另一种方式有任何惩罚?a放在堆上,az放在堆栈上。负责释放内存的堆。当堆栈超出范围时,它会自动释放。因此,答案是您希望何时放置数据,以及是否需要将if放在范围的末尾 PS您应该在C++中使用new(新的)一般来说,您应该避免动态内存分配(malloc,calloc,new),因为它相当简单:它们比堆栈分配慢,但更重要

注意,第一个变量int*a被声明为指针,然后我为它调用内存。但是,对于az,它不是指针,而是在调用函数时,我得到内存的地址


所以,我的问题是:是否有一种更可取的方式=,或者一种方式比另一种方式有任何惩罚?

a
放在堆上,
az
放在堆栈上。负责释放内存的堆。当堆栈超出范围时,它会自动释放。因此,答案是您希望何时放置数据,以及是否需要将if放在范围的末尾


PS您应该在C++中使用new(新的)

一般来说,您应该避免动态内存分配(
malloc
calloc
new
),因为它相当简单:它们比堆栈分配慢,但更重要的是,您必须记住释放(
free
delete
)手动分配通过动态分配获得的内存,否则会出现内存泄漏(就像代码中发生的那样)。

直接在堆栈上分配小变量通常会更快,因为您不必执行任何堆操作。与指针相关的失误(例如,双自由度)的可能性也较小。最后,您使用的空间更少。撇开堆开销不谈,您仍然在移动指针和int

int* a = (int*)malloc(sizeof(int));
这将在堆上分配内存。你必须自己解除分配,否则你会遇到内存泄漏。您可以通过调用
free(a)取消分配它。这个选项的速度肯定较慢(因为必须请求内存,并且必须完成其他一些后台工作),但是只要您调用空闲内存,内存就可能可用


这会在堆栈上“分配”内存,这意味着当您离开声明的函数时,它会自动被销毁(除非出现一些非常罕见的异常)。你不必整理记忆。此选项速度更快,但您无法控制对象何时被销毁。

第一行(int*a=…)称为动态分配变量,如果您在运行前不知道需要多少变量,或者根本不需要它,则通常使用此选项


第二行(intaz=0)称为自动变量,使用更为频繁

我不知道你想做什么,但几乎没有一个 为此分配单个
int
(或
int
数组)的原因 物质)。您的
函数调用中至少有两个错误:
首先,它无法检查空指针(如果指针不能
null,通过引用传递),其次,它什么也不做:它
递增作为参数传递的指针的副本,然后
取消引用初始值并抛出读取的值

int az = 0;
functioncall(a);
就行为而言,这没关系

int* a = (int*)malloc(sizeof(int));
functioncall(&az);
当您执行
*i++
时,这将调用函数内部的未定义行为(UB)。因为
malloc
只分配内存,所以它不会初始化内存。这意味着,
*i
仍然未初始化,读取未初始化的内存调用UB;这就解释了为什么
*i++
是UB。UB,如果你知道,是C++中最危险的事情,因为它意味着任何事情都可能发生。 至于最初的问题,你更喜欢什么?因此,答案是,更喜欢自动变量而不是指针(无论是分配给
malloc
还是
new

自动意味着快速、干净和安全。

func(typename*p)

指针是调用值

*p++是*p和p++


如果更改此指针,则不更改原始指针

为什么要使用
malloc
而不是
new
?我以为new只用于类实例化而不是本机类型?
new
适用于所有类型。使用new会在哪里分配内存?堆或堆栈?
functioncall
,至少如上所述,仅递增
i
,这是一个局部变量;论点的副本<代码>*i++
*(i++)
。我明白你的意思,我把代码修改为*i=*i+1;可以肯定的是,我正在更改取消引用的值。感谢您指出这一点:)@gasdeveloper只需添加括号(
(*i)+;
)就足够了。或
*i+=1
int* a = (int*)malloc(sizeof(int));
functioncall(&az);