指针能指向自己吗?

这个问题在这里提到。

我的问题是: 如果一个指针variables具有相同的地址作为它的值,它真的指向自己?

例如 – 在下面的一段代码中,是一个指向它自己的指针?

 #include<stdio.h> int main(){ int* a; int b = (int)&a; a = b; printf("address of a = %d\n", &a); printf(" value of a = %d\n", a); } 

如果a不是自己的指针,那么同样的问题又出现了: 指针可以指向自己吗?
另外,自我指点指针如何有用?

你实际上在做什么没有指针指向自己。 您正在使用分配给指针的内存空间来存储指针的位置 。 指向int的指针指向整数 – 从不指向其他指向整数的指针,包括自身。

例如,假设您创build一个指针a

 int * a; 

它在记忆中获得了自己的位置:

  4 a (5) 6 [....][00000000][....] 

在这个简单的例子中,假设a在内存位置“5”。

如果你这样做:

 a = (int*)&a; 

…会发生以下情况:

  4 a (5) 6 [....][00000005][....] 

这里发生了什么是a指向它认为是在位置5的一个整数。这也恰好是&a所指向的相同的内存位置,但是在指向的内容中,它现在指向整数在位置5 – 和整数是5。

例如,这两个将工作:

 cout<<(int)a;//outputs 5 cout<<*a;//Outputs the integer at memory location 5 - which is 5. 

如果你想创build一个指针,你绝对可以 – 这些方法之一:

 int **b = (int**)a; 

要么

 int ** b = &a; 

但是认识到a不是自己的指针是非常重要的。 它是一个指向它所存储位置整数的指针 – 恰好与它自己的位置相同。


为了进一步展示(通过一个更简单的例子)发生了什么事情, int可能会发生类似的情况。 也就是说,你可以把int的内存位置存储在它自己内部:

 int a=999; 

现在在内存中有一个位置,它的值是999(我们假设它已经放在内存位置'46'):

  45 a (46) 47 [....][00000999][....] 

它位于'46'的位置 – 如果我们想要的话,我们可以把这个数字作为一个整数存储在:

 a=(int)&a; 45 a (46) 47 [....][00000046][....] 

现在a等于&a的值,但不是typesa只是一个整数,它现在并不指向它自己,因为我们用它来存储自己的内存位置。

 void* p = &p; 

这不是非常有用,但指向自己的结构在长度为1的循环列表中很有用:

 typedef struct A { struct A* next; } A; A a = { &a }; 

根据你的确切例子,我相信你的意思是:

 int* a; int b = (int)&a; a = (int*)b; // which can be simplified to: int* a = (int*)&a; 

MFFFFFFF中的内存地址可以存储值FFFFFFFF

那么,首先我会改变代码:

 int **a; a = (int **)&a; // otherwise you get a warning, since &a is int *** 

我不知道你为什么要这样做,但这是允许的。

 printf("The address of a is %p\n", &a); printf("a holds the address %p\n", a); printf("The value at %p is %p\n", a, *a); // the *a is why we made a an int ** 

他们应该打印出相同的东西。

 The address of a is 0x7fffe211d078 a holds the address 0x7fffe211d078 The value at 0x7fffe211d078 is 0x7fffe211d078 

请注意,这不是一个好主意,因为它首先强制转换a = (int **)&a是强制a保留一个它不应该保留的值的方法。 你声明它是一个int **但试图强制一个int ***进去。 从技术上讲,大小是相同的,但一般不这样做,因为人们期望int *拥有可以用作int的东西的地址,等等。

是和否,因为指针的types几乎和指针的值一样重要。

是的,指针可以包含指向自身的指针的位置; 即使是很长的一段也可以包含指向自己的指针的位置。 (Ints通常是可以的,但是我不知道是否到处都有保证。)

但是,没有types来表示这种关系。 如果你有一个指向它自己的指针,你实际上有一个不同的types,当你解除引用。 所以:

 void *p = &p; // *p is illegal, even though you probably wanted it to equal 'p' if( *p != p ) { printf("Something's wrong"); } int *i = (int*)&i; // The following statement is still illegal if( *i == i ) { printf("The universe works!"); } 

我会说答案是'不',因为除非你打算滥用types系统,否则不行。 我认为这是一个迹象表明你做错了什么(虽然有时这是必要的)。

解引用指针会导致其值types (例如,取消引用int*会给出intint*的值types)。 对于一个指向指针的variables,它的值types必须是int* ,如前所述, int*不是这种情况。 所以对于一个指向自身的指针来说,为了得到它,编译器必须进行某种types的转换:

 int* a; a = reinterpret_cast<int*>(&a); 

为了解引用,你需要一个int值,它的值恰好是a所在的地址(为了适应types而对地址的mod截断),但是它仍然是一个int而不是int* ,这就需要另一个演员。

指向指针的指针通常被称为句柄 ,它与指针( int* )是不同的types( int** )。 (请注意, int**句柄的值types为int* 。)

是的,指针可以像答案中提到的那样指向自己。

一个可能的用例是我们可以用这个技巧来代替NULL指针。 您可以初始化int * p =(int *)&p,稍后检查该指针是否有效。 如果在我们想要0x0而整个地址范围是有效地址的系统中说这可能会被使用。

你也可以在特殊的C程序中使用这个技巧,它不会在NULL指针的使用上崩溃,因为你完全可以避免它们,而且在解引用系统上不会崩溃。 这将导致错误的行为,但可能有助于在某些情况下进行debugging。

是的,有可能指向自己。

 int* a; a = &a; 

但没有任何用处,至less明确这样。