我正在读一本书,我怀疑这些语法的作用。前三行我能理解,但以下没有。非常感谢你帮助我,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;
答案 0 :(得分:2)
值,指针和引用的概念经常让人兴奋,特别是因为他们经常被教导用术语来看待他们实施,而不是语言。
值是存在且具有意义的东西。它始终具有类型(其含义的约束),例如int
,float
,char
和vector<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=&cable1
将cable1
(可能是浮动?)的地址分配给longitud
,现在引用 cable1
。
*longitud=40.5
取消引用经度并为其指定值40.5。由于longitud
引用cable1
,因此会将值分配给cable1
。那是*longitud
和cable1
是一回事。
这些都与问题标题“指针声明与间接之间的区别” - 间接是一般的计算概念和指针是在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行是这样做的:
第二行3行:
如果你在第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版。这是一个有点过时但是学习基础知识的好方法。