为什么我应该使用双指针变量来接收另一个指针的地址(& ptr1)

时间:2013-07-16 14:57:54

标签: c pointers pointer-to-pointer

int num = 45,*ptr1,*ptr2;
ptr1=#
ptr2=&ptr1;
printf("%d\n",*ptr1);

我一直在考虑这个问题,但找不到理解它的方法,为什么{3}}无法在第3行&ptr1分配ptr2 &ptr1 }是指针的地址,这个地址与其他地址没有区别,比如整数地址,比如

int a=1;
ptr2=&a;

这意味着我可以为指针分配一个整数的地址,但不能指向指针的指针地址,这两个“地址”之间的差异是否可能使它们不同?公共变量的地址可以分配给单个指针,但是指针的地址不能分配给单个指针?

我知道正确的方法是使用双指针来声明ptr2,但为什么单个指针不能?

7 个答案:

答案 0 :(得分:3)

简单地说,指针不是地址,它们是表示具有类型的地址的变量。因此,类型与指定的指针兼容(void *通用指针除外)。

ptr2 = &ptr1;

ptr1的类型为int *,因此&ptr1的类型为int **,与ptr2的类型不同,int *的类型为{{1}}。

参考:C99 6.5.16.1 简单分配

  

两个操作数都是指向兼容类型的限定或非限定版本的指针,左边指向的类型具有右边指向的所有类型的限定符。

答案 1 :(得分:1)

是的,可以将指针的地址分配给指针,但它必须是指向变量的指针。

int **ptr3;
ptr3 = &ptr1;

您无法按照您尝试的方式分配它的原因是指向int的指针与int不同。指针必须指向相同的类型才能兼容。如果你真的知道你在做什么,你可以明确地施展它,但那是危险的途径。

答案 2 :(得分:1)

你的代码错了。这个表达式:

ptr2 = &ptr1;

尝试在没有演员表的情况下从int *中制作int **。 C标准禁止此类转换而不进行明确的转换。

不允许的原因是标准不能保证指针类型都具有相同的大小 - 因此指向指针的指针可能不适合您声明为{{1}的指针的变量}。

由于指向任何类型的指针都可以隐式转换为int,因此您可以在问题中编写(更正,但可能令人困惑)类似的代码:

void *

但这样做会要求您以其他方式携带所有类型信息:

int num = 45;
void *ptr1, *ptr2;
ptr1 = #
ptr2 = &ptr1;

答案 3 :(得分:1)

简短的回答是类型很重要;指向int的指针是指向int的指针的不同的不兼容的类型。正如其他人所提到的,不同的指针类型可能有不同的大小和表示。

指针值不仅仅是一个地址;它有额外的类型语义。例如,表达式ptr++将指针指向基类型的下一个对象的地址。如果基类型为char,则指针前进1个字节。如果基类型为int,则指针为高级sizeof (int)字节。

答案 4 :(得分:1)

简单地说因为它会混淆编译器。编译器只能根据语言标准工作。它没有自己的大脑。

语言标准告诉编译器是否有int *

  

转到存储在该变量中的地址并使用它。

如果有int **,则会告诉它

  

转到该变量中的地址。你还没有完成,因为那也是一个地址。去那里使用那里的东西。

int ***依旧等等。

希望这有助于你克服这种基本的混乱。

答案 5 :(得分:0)

如果您可以将任何地址分配给任何指针而不管其类型如何,理由是一个地址就像任何其他地址一样,请考虑如果以下内容合法,您可能会遇到的麻烦:

int n = 40;
int * p = &n;
int ** pp = &n;  /* Typeless address assignment as you would like */
printf("%d\n", **pp); /* Bad Things happen here */

或反过来说:

int n = 40;
int * p = &n;
int * p2 = &p; /* More typeless address assignment */
printf("%d\n", *p2); /* Definitely not what you want */

即使一个地址与其他地址相同,如果事情按照你建议的方式工作,明智地取消引用指针会变得有些麻烦。

您无法按照建议执行操作的原因是,取消引用工作时需要根据提案丢失的类型信息。如果您想要指向的只是存储和检索地址,那么您有一个观点,但它们不仅仅用于此。如果是的话,我们可以只有void指针并完成它。

答案 6 :(得分:0)

我完全同意你的声明,当指针变量总是存储一个整数值时,因为任何变量/数组的地址都是整数。

但是,用于声明指针的数据类型仍然是它将存储的地址。

有3点:

 1. The bits that are used while storing integer values differ from machine to machine.
    i.e. 32-bit, 64-bit and further more complications may add-up.

 2. Memory occupied i.e. bytes of data stored in it. Reason is : somewhere even the pointer variable is stored in memory. Right?

 3. There are certain operations associated with pointers like ++ or --.

请记住,指针类型取决于它指向的变量类型。 这是指向指针的原因/需要。