繁体   English   中英

C ++中的指针和函数

[英]Pointers and Functions in C++

从大学课程的讲义中,了解“按价值致电”:

 void fun(int *ip) { *ip =100; } 

打电话给

 int n=2; int *np; np = &n; fun(np); 

会将n的值更改为100。

当我们说“ int * ip”时,我们到底是什么意思? 类型为整数的指针? 如果是这样,当我们使用np作为参数调用fun()时,应该不会出现错误,因为np的地址为n,而不是整数?

然后,我们将ip的值更改为100,这是否不意味着n现在具有地址为100的“内存插槽”中的值? 我相信我错过了一些东西。 :)

类型为整数的指针?

不,一个指向整数。

当我们使用np作为参数调用fun()时,应该不会出现错误,因为np的地址为n,这不是整数?

n是整数,所以没有问题。 &nnpip在您的代码中都具有相同的类型: int*

然后,我们将ip的值更改为100

不……我们更改*ip的值,而不是ip 也就是说,我们更改ip 指向的值(有时也称为pointee )。

是的,当您将int *用作fun的参数类型时,是说它接受指向int的指针。 由于np是指向int的指针,可以将其传递给fun

npip指向n的地址,因此当您分配*ip = 42之类的值时,它将把42的值分配给ip所指向的内存位置n

示例代码中的内容称为指针传递 您的函数具有类型为integer的指针的参数。 因此,传递给函数的值是变量n 的地址 功能分配100给变量(即,存储位置)由指针参数指向 ip 星号*是C / C ++中的取消引用运算符

用作type*表示“指向该类型的指针”

常用的是int *var ,但是我喜欢将其写为int* var因为这使得它与取消引用指针(即*ptr有更好的区别。

所以int* a表示,a是指向int类型的对象的指针, *a表示由a指向的对象, &a表示对象a的地址。

在fun()中,您没有将ip的值更改为100,而是在ip指向的内存位置进行了更改。

np视为int*类型。 请记住,为此,星号和int共同构成“ int的指针”类型,并且不可分离。

ip是一个指针,使用ip*可以访问它所指向的“内存插槽”。 np也是一个指针。 使用&n分配的内存插槽的地址nnp 因此,当调用fun() ,在fun()内部,唯一要访问的内存插槽是n的一个,因此分配给n 100。

因为n和np都存储数字,所以这里可能会有些混乱-但是,在编译时,编译器将以不同的方式使用数字。 那就是

n++;

np++;

都是实际的算术运算,生成的程序集是不同的。 重要的是要记住,最终,计算机中的所有数据都是数字。 它们之所以成为不同类型的数据,仅仅是因为我们对待它们的方式有所不同。

特别是关于您的示例,

*np = 100;

您需要记住, *表示取消引用 ,并且该操作发生在赋值之前。 多余的括号可能更清楚:

(* (np) ) = 100;

或在其他情况下:

int n = *np;

现在,我必须说,当你说:

我们将ip的值更改为100,那么这是否不意味着n现在具有地址为100的“内存插槽”中的值? 因为它掩盖了我认为是重要的理解。 但是,我相信我说的对,您必须竭尽全力对指针进行此类操作:

static_cast<int>(np) = 100;

这将按照您的描述进行操作,因为它告诉计算机将np的数字视为另一种数字。 就像static_cast<char*>(np)将np指向的数字视为字符一样,而不是整数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM