2

来自大学课程的讲义,关于“按价值调用”:

void fun(int *ip)

{

*ip =100;

}

int n=2;  

int *np;

np = &n; 

fun(np);

会将 n 的值更改为 100。

当我们说“int *ip”时,我们究竟是什么意思?整数类型的指针?如果是这样,当我们以 np 为参数调用 fun() 时,由于 np 的地址不是整数,不应该有错误吗?

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

4

8 回答 8

7

整数类型的指针?

不,一个指向整数的指针。

当我们以 np 作为参数调用 fun() 时,由于 np 的地址不是整数,所以不应该有错误吗?

n是整数所以没有问题。&nnp并且ip在您的代码中都具有相同的类型:int*.

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

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

于 2010-01-19T21:58:41.223 回答
0

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

np并且ip指向 的地址n,因此当您分配一个类似的值时*ip = 42,它会将 42 的值分配给ip指向的内存位置 - 这是n.

于 2010-01-19T21:57:01.847 回答
0

示例代码中的内容称为按指针传递。您的函数有一个指向 integer 类型指针的参数。所以传递给函数的值就是变量的地址n。该函数分配给指针参数指向100变量(即内存位置)。星号是C/C++ 中的取消引用运算符。ip*

于 2010-01-19T22:00:20.293 回答
0

type*用作类型的意思是“指向该类型的指针”

常见的用法是int *var,但我喜欢这样写,因为int* var它可以更好地区别于取消引用指针,即*ptr.

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

于 2010-01-19T22:00:34.303 回答
0

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

于 2010-01-19T22:00:31.480 回答
0

认为np是 type int*。请记住,为此目的,星号和int一起构成“指向 int 的指针”类型,并且不可分离。

于 2010-01-19T22:00:41.370 回答
0

ip是一个指针,ip*您可以访问它指向的“内存插槽”。np也是一个指针。使用&n您将内存插槽的地址分配给nto np。因此,当调用 时fun()fun()唯一访问的内存插槽是其中之一n,因此n分配了 100。

于 2010-01-19T22:02:37.497 回答
0

这里可能会有些混淆,因为 n 和 np 都存储数字 - 但是,在编译时,编译器会以不同的方式使用数字;也就是说,虽然

n++;

np++;

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

特别是关于你的例子,

*np = 100;

您需要记住*意味着取消引用,并且该操作发生在分配之前。用多余的括号可能会更清楚:

(* (np) ) = 100;

或在不同的情况下:

int n = *np;

现在,我必须说,当你说,它温暖了我的心,

我们将 ip 的值更改为 100,这是否意味着 n 现在具有地址为 100 的“内存槽”中的值?因为它掩盖了我认为的重要理解。但是,我相信当我说的时候我是对的,你必须不遗余力地对指针做那种事情:

static_cast<int>(np) = 100;

This would do what you described, because it tells the computer to treat the number that is np as a different kind of number; in the same way that static_cast<char*>(np) would treat the number np points to as a character, rather than as an integer.

于 2010-01-20T05:47:44.073 回答