[英]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
是整数,所以没有问题。 &n
, np
和ip
在您的代码中都具有相同的类型: int*
。
然后,我们将ip的值更改为100
不……我们更改*ip
的值,而不是ip
。 也就是说,我们更改ip
指向的值(有时也称为pointee )。
是的,当您将int *
用作fun
的参数类型时,是说它接受指向int的指针。 由于np
是指向int的指针,可以将其传递给fun
。
np
和ip
指向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
分配的内存插槽的地址n
至np
。 因此,当调用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.