int num = 45,*ptr1,*ptr2;
ptr1=#
ptr2=&ptr1;
printf("%d\n",*ptr1);
我一直在考虑这个问题,但找不到理解它的方法,为什么{3}}无法在第3行&ptr1
分配ptr2
&ptr1
}是指针的地址,这个地址与其他地址没有区别,比如整数地址,比如
int a=1;
ptr2=&a;
这意味着我可以为指针分配一个整数的地址,但不能指向指针的指针地址,这两个“地址”之间的差异是否可能使它们不同?公共变量的地址可以分配给单个指针,但是指针的地址不能分配给单个指针?
我知道正确的方法是使用双指针来声明ptr2
,但为什么单个指针不能?
答案 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 --.
请记住,指针类型取决于它指向的变量类型。 这是指向指针的原因/需要。