我知道这很基本,但对我来说有点困惑。我读过:
a pointer is nothing more than an address, and a pointer variable is just a variable that can store an address.
When we store the address of a variable i in the pointer variable p, we say that p points to i.
p指向i。
为了访问指针指向的对象,我们使用*操作符。
If p is a pointer then *p represents the object to which p currently points.
现在我很困惑,我应该怎么称呼p--指针或指针变量?
附加:指针是否始终与地址相同?
- 读取"取消引用"指针是什么意思?可能会有所帮助,当然,从wiki上看:"指针(计算机编程)"。
- @我在问这个问题之前已经阅读了第一个链接。感谢您提供第二个链接。
- @Grijeshchauhan;感谢wiki链接。它以一种非常漂亮的方式解释了取消引用(实际上,如果您没有提供链接,这是我的下一个问题:)。
- 通常,最好(至少作为初学者)将这些类型的声明分成多行。也就是说,int i, *p = &i;相当于int i;int *p = &i;。
1.The difference between a pointer value and a pointer variable is implorated by:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| int swap_int (int *i1 , int *i2 )
{
int t = *i1 ;
*i1 = *i2 ;
*i2 = t ;
}
int main (void)
{
int v1 = 0;
int v2 = 37;
int *p2 = &v2 ;
printf("v1 = %d, v2 = %d
", v1 , v2 );
swap_int (&v1 , p2 );
printf("v1 = %d, v2 = %d
", v1 , v2 );
return 0;
} |
这里是一个变量指针,它是一个指针。在另一个手上,在呼唤swap_int()时,&v1是一个指针值,但无意中是一个指针变量(在呼唤函数中)。这是一个指向变量的指针(变量是EDOCX1&22),但简单写入EDOCX1&21)并不是创建一个指针变量。Inside the called function,the value of the pointer &v1is asmissed to the local pointer variable i1,and the value of the pointer variable p2is asmissed to the local pointer variable i2,but that's not the saying &v1is a pointer variable(because it isn't a point简单的指针值。
然而,对许多目的而言,区别是虚假的。人们会说,这是一个指针,它是一个指针,它的价值是一个指针,它的价值是一个指针,它的价值是一个指针,它的价值是一个指针。你得到了同样的忧郁,是一个EDOCX1&3;,它实际上是一个EDOCX1&3;)变量及其价值是一个EDOCX1&3。
- 无论如何,afaik标准甚至不使用术语"变量"。
- @你的意思是指针变量?
- @不,当我写"变量"时,我的意思是"变量"。
- @h2co3;那么内存地址标准中使用的术语是什么?
- @hacks"pointer-to-t",其中"t"是一个类型。"对象"用于变量IIRC,但您可以检查当前或以前的C标准(分别是C11和C99),它们在互联网上是免费的。
- @h2co3;hmmm。所以最好是说指向类型的指针*指向变量/对象的指针*对吗?
- 让我们在聊天中继续讨论
- @乔纳森·莱弗勒;还有:指针总是和地址一样吗?
- 我会说:"是的:一个有效的指针总是某个对象或函数的地址;一个空指针是无效的,但可以识别;其他无效的指针使用起来很危险——即使在不取消对它们的引用的情况下读取它们,也可能会在某些(主要是大型机之类的)系统上造成问题。"
- @h2co3:在第&167;5.1.2.3节中,一些非规范性(示例)文本指出,抽象机[必须]将每个变量的值提升到int大小,然后添加两个int并截断和。在第6节(语言的主要定义)中,还有一些对变量的非规范性引用,但是主SPiel设法避免使用变量这个术语,除了变长数组和变量参数列表之外,两者都不重要。
- 在您给出的示例中,您将v1的地址分配给p,它不应该是v2的地址吗,因为我们交换v1和v2?
- 是的,我也会修好的。
- @是的,好的。这就是我的想法。(我没有坚持整个文档根本不包含这个词,只是核心标准文本没有使用它来描述那些具有名称、类型和值的东西。)
让我们用希望更熟悉的数据类型替换单词"指针",比如int:
这里42是一个int值,n是一个保存int的变量。你可以把n称为"int变量"。int是一个类似于42或-25315685的数字,而int变量保存这些数字。一旦你有了一个变量,你就可以给它分配不同的数字。到目前为止没有什么令人困惑的?
指针就像一个整数:一个数字。它碰巧是一个识别内存位置的数字,如果某个东西存储在该内存位置中,您可以称之为地址。与int类似,指针也可以存储在变量中。存储指针的变量可以称为指针变量。
那么,指针和指针变量有什么区别呢?第一个是一个值,就像一个数字,第二个存储这些值。但是,人们通常根据存储的值来引用变量;人们不称n为"int变量",只称int,尽管它可以在不同的时间存储不同的int变量。在本文中,当我指的是指针变量时,我将执行相同的操作,有时编写指针;希望区别是cl。耳朵。
指针总是地址吗?这是一个关于"地址"这个词含义的问题,比其他任何问题都要多。指针总是一个地址,在某种意义上,它以某种方式对应于一个内存位置,它是该内存位置的"地址"。但另一方面,如果程序无法访问内存位置,或者没有任何有用的存储内容,那么它真的是一个"地址"吗?
现在让我们研究以下代码:
第一行声明一个名为p的指针变量。可以存储到p中的指针是int数据的内存位置;这一点很重要,我们稍后将看到。我们仍然不给p任何值,因此它存储的指针是任意的。它当然不会存储任何有用的地址;它甚至可能指向程序无法访问的内存区域。
在第二行中,我们用&操作符获取n变量的地址,并将其赋给p。现在,p存储n的地址,存储n值的内存位置。
我们能用指针做什么?我们可以读写指针标识的内存位置。为此,我们使用*运算符"取消引用"指针,然后可以像使用n一样使用(*p)。例如,您可以将一个新值写入n中:
此时,很明显,我们需要知道p可以指向的数据类型:否则,您就不知道可以将什么分配给(*p)。
了解p可以指向的数据类型很重要的另一个原因是指针算法。例如,p+1是指向存储在n之后内存中的int的指针;如果p是指向大数据结构的指针,p+1将是指向存储在它之后的同一类型数据结构的指针。为此,编译器必须知道指针指向的对象的大小。
- 谢谢你解释了另外一个(但我没有完全理解你的解释)+1。
- 你觉得哪些部分很难理解?
- 你的调查部分真的很好,它帮助我理解了一些好的观点,但它不是针对我的问题的;指针总是地址吗?
- 好吧,这取决于"地址"的含义,但我会说"不"。假设您正在为现代计算机编写一个程序:程序要求操作系统提供一些内存。唯一有效的地址是操作系统返回的内存,但是在指针中可以存储更多的值。或者想象一个没有操作系统的嵌入式系统。唯一有效的地址是实际安装的内存,它通常是不同指针值数量的一部分。指针不总是有效的地址。
是一个指针变量,这是一个变量EDOCX1。我们可以简单地称它为指针。
声明:
1 2 3
| int* p;
int i;
p = &i; |
作为一种类型的对象的标识。这通常作为'p is a pointer to i'更为简短。在p = &i表达式之后,可以重新计算变量i。使用指针p获得变量i的价值,你可以使用*(E.G.*p)。与*p = 10;相等。
另一方面,p = &i;表达式通告,以读取i的地址。
一个指针只是一个逻辑地址(一个可参照变量的标识符)。标准C不确定指针是内部的,指针是如何在内部工作的。
如果没有记忆地址,准确地说是什么?Additionally,read this:to understand the purpose of pointers.
- 但据说指针只不过是一个地址
- 对。给我一点时间,我正在经历。
- 乔纳森解释得很好。再次感谢您的链接。
- @欢迎你,是的,乔纳森是个了不起的人!我读了他的许多答案。
变量是存储价值的地方。在C中,当你在一个需要一个值的上下文中使用一个变量时,则检索变量的价值,在这个上下文中,表示"P"是相同的,即"变量P的价值":
ZZU1
该术语的指针和指针变量经常使用同义词。
指针:一个变量,其值是另一个变量的地址。
指针变量:包含存储另一个变量、数据值或函数的内存位置或地址的变量。