指针声明和间接指令之间的区别

时间:2018-01-03 19:56:13

标签: c++ c pointers

我正在读一本书,我怀疑这些语法的作用。前三行我能理解,但以下没有。非常感谢你帮助我,Julieta

int m; //m is int variable 
int *p; //Pointer p pointing to an integer value
p=&m //The memory address of the variable m is assigned to p

float *longitud;
longitud=&cable1;
*longitud=40.5;

5 个答案:

答案 0 :(得分:2)

指针引用的概念经常让人兴奋,特别是因为他们经常被教导用术语来看待他们实施,而不是语言。

是存在且具有意义的东西。它始终具有类型(其含义的约束),例如intfloatcharvector<string>

对象是存在于内存中的值。 (而不是,比如说,机械指令代码或者以某种方式即时生成。也就是说,我可以取出我的记忆芯片并用手指抓住它,我的手指足够敏捷。)

引用别名 - 对象的名称。这个名字对我们程序员来说很方便。编译器如何维护该名称并不重要。重要的是(语言视角!),如果你有一个名字,你就可以直接访问到一个对象。

要将其放入透视图中,只要您命名对象,就可以获得该对象的直接引用。您可以使用其名称直接操作该对象。

指针是一个值。它的类型是计算机内存中某个对象的位置。通过此位置,我可以访问对象的值。换句话说,我可以使用指针来获得对象的直接引用。

词汇+时间=变化无常的理解并鼓励人们提出无用的事情 2 。让我们清醒一下。

  • 首先,指针不是引用,它是间接引用。为了获得实际或直接,引用指向对象,我们“取消引用”指针。换句话说,我们执行一个魔术来转换指针值以获得对象的引用。

指针如何工作的机制通常根据底层硬件如何“跟随指向值的指针”来构建。我们用箭头和一切画画。我们似乎忘了问这个魔法是如何起作用的。没有人问变量名称是如何工作的,但它是完全相同的魔法。当被告知“编译器处理它”时,我们完全信任。

  • 遗漏的是(直接)引用(对象的别名或名称)与间接引用(可用于获取对象引用的指针或其他东西)之间的区别。

在C ++之前,直接引用和间接引用之间的区别实际上只在指针的上下文中有意义,并且很容易将指针称为“引用”而不是完整的短语“间接引用”,因此词汇表在我们头脑中混淆了一些词语,我们开始误解所涉及的实际概念。

输入C ++,左转。除了指针之外,我们现在还有称为“引用”的东西。就语言而言,它们是其他对象 1 的真正别名。

举个例子:

int  x = 7;   // "x" is a reference to the integer object with value 7
int& y = x;   // "y" is a reference to the same integer object as "x".

int* p =      // "p" is a pointer object whose value is an 
              //     indirect reference to some integer object:
         &x;  // The & operator obtains an indirect reference (or pointer value) to "x"

这是最后一点。 &#34;&amp;&#34;!

有多个含义
  • 当附加到类型时,表示该类型是对某个对象的直接引用
  • 当附加到对象时,表示获得对该对象的间接引用

1 在C ++中,抽象泄漏,因为对象的生命周期仅绑定到原始引用。但这既不是在这里也不是在那里。在SO处还有其他主题可以处理。

2 所以,回答每个人最喜欢的问题:引用指针与否?答案是,没关系。 (除非您正在编写编译器。)您正在询问有关用于维护语言级概念的魔术的实现细节。所以有时它可能是一个实际的指针,有时它可能只是编译器的本地符号表中的另一个条目,如果编译器编写者认为它有用且合适,它甚至可能是其他的东西。

3 语言变得模糊。我之前曾说"p" is a pointer。从技术上讲,它是一个对象,其值是指针类型。我们通常可以通过说出一个对象是什么类型的东西来逃避,并且很容易被理解。只有当我们分裂头发(在上下文中)时,词汇需要更多的关注,就像在这里一样。

答案 1 :(得分:1)

longitude是指向浮点变量的指针

longitud=&cable1cable1(可能是浮动?)的地址分配给longitud,现在引用 cable1

*longitud=40.5取消引用经度并为其指定值40.5。由于longitud引用cable1,因此会将值分配给cable1。那是*longitudcable1是一回事。

这些都与问题标题“指针声明与间接之间的区别” - 间接是一般的计算概念和指针是在C和C ++中实现间接的手段。

答案 2 :(得分:1)

假设您在每个部分中再添加一行(不同):

int m;              // m is int variable 
int *p;             // pointer p is pointing to an integer value
p = &m;             // the memory address of m is assigned to p
*p = 42;            // ADDED: assign 42 to m, where p points to

float cable1;       // ADDED: the variable where longitud points
float *longitud;    // pointer longitud is pointing to a float value
longitud = &cable1; // the memory address of cable1 is assigned to longitud
*longitud = 40.5f;  // assign 40.5 to cable1, where longitud points to

这样就完成了类似的例子,它们使用了不同的变量类型。

答案 3 :(得分:1)

执行行

float cable1;       // ADDED: the variable where longitud points
float *longitud;    // pointer longitud is pointing to a float value
longitud = &cable1; // the memory address of cable1 is assigned to longitud

以下条件属实:

 longitude == &cable1
*longitude ==  cable1

IOW,表达式 *longitud等同于表达式cable1。所以当你写

*longitud = 40.5f;

这相当于写作

cable1 = 40.5f;

*运算符取消引用 longitud指针,以便表达式 *longitud的计算结果与{{{{1}相同。 1}}。

答案 4 :(得分:0)

Cable1需要在纵向指向它之前有一个位置存储器。

前3行是这样做的:

  1. 为int。留出内存。
  2. 创建一个int指针。
  3. 获取指向int的内存地址的int指针。指针引用int。
  4. 第二行3行:

    1. 创建一个浮动指针。
    2. 获取浮点指针以指向不存在的地址。
    3. 尝试为该地址指定一个浮点值。
    4. 如果你在第4行写了:

      float cable1;
      

      你会留出记忆,一切都会正常。

      关于主题,您的意思是指针声明和解除引用。我可以提供一些简短的例子,但主要是阅读和练习来学习。试试这些并感受一下。

      float f = 22.2f;   //sets aside memory for a float with the name "f", stores 22.2
      float *pf;         //declares a float pointer.
      pf = &f;           //sets pf to point to f's memory address. pf references p.
      printf("%f", *pf); //prints the value at the referenced address (22.2)
      printf("%x", pf);  //prints the memory address of the pointer itself
      *pf = 33.3f;       //changes the value at f's address to 33.3 (from 22.2)
      f = 44.4f;         //changes the value at f's address to 44.4 (from 33.3)
      float *pf2;
      *pf2 = 33.3        //BAD. pf2 is not assigned to an address, no value to change.
      *pf2 = f;          //BAD. pf2 has no memory address to copy the value to.
      *pf2 = pf;         //BAD. several reasons.
      pf2 = pf;          //pf2 now points to f's address, too.
      pf2 = &f;          //redundant. Same as the last line.
      *pf2 = 55.5        //f has changed to 55.5. both pf2 and pf point to it.
      

      当你宣布时,只要想到*代表“指针”。当您稍后使用*时,它意味着“取消引用”。取消引用指针意味着您要查看/使用/更改引用的值。稍后,您将了解到指针可以指向其他指针。所以a(char **)类型的值是type(char *),而不是type(char)。

      如果你没有书,我推荐C编程 - 现代方法第2版。这是一个有点过时但是学习基础知识的好方法。