【问题标题】:Pointers and Functions in C++C++ 中的指针和函数
【发布时间】:2011-01-07 00:47:20
【问题描述】:

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

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 的“内存槽”中的值?我确定我错过了一些东西。 :)

【问题讨论】:

  • 如果你只是想改变一个变量的值,你也可以写int n = 2; fun(&n);
  • np 的类型为“int*”,如果这有助于您理解的话。

标签: c++ pointers function pass-by-value


【解决方案1】:

整数类型的指针?

不,一个指针一个整数。

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

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

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

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

【讨论】:

  • 这里可能有助于澄清的一件事是强调类型是int*,即使它是写成int *ip - C++ 允许我们以任何一种方式编写它(int* ipint *ip ) 但两者意思相同。
  • 是的,但有一个问题:如果你说int* ip, ip2;ip 是指向int 的指针,但ip2 只是一个int* 与名称相关联,而不是类型。因此人们写信int *ip;来提醒自己。
  • @jamesdlin:我知道这一点——我所做的评论并不意味着它是特定于 C++ 的;我只是使用 C++,因为这是 OP 所问的。 :)
【解决方案2】:

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

npip都指向n的地址,所以当你赋值*ip = 42之类的值时,它会将42的值赋给ip指向的内存位置——这是n

【讨论】:

  • 所以“int *pointer”的意思是“指向整数的指针”。但是那个变量/元素是什么类型的?因为对我来说 *pointer(这是一个值)和 np(这是一个地址)不是一回事。
  • 在指针声明中,您使用int* 表示您想要一个指向 int 的指针。稍后将指针用作变量时,添加*,就像在*ip 中一样,以访问指针指向的值。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      type* 用作类型意味着“指向该类型的指针”

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

            n++;
            

            np++;
            

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

            特别是关于你的例子,

            *np = 100;
            

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

            (* (np) ) = 100;
            

            或在不同的上下文中:

            int n = *np;
            

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

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

            static_cast<int>(np) = 100;
            

            这将按照您的描述进行,因为它告诉计算机将 np 的数字视为不同类型的数字;就像static_cast&lt;char*&gt;(np) 将 np 指向的数字视为字符而不是整数一样。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-09-12
              • 1970-01-01
              • 1970-01-01
              • 2016-01-03
              • 2023-03-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多