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

这个问题我想了好久,一直没能理解,为什么&ptr1不能ptr2在第3行赋值,&ptr1是指针的地址,这个地址和其他地址没什么区别一个整数,比如说

int a=1;
ptr2=&a;

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

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

4

7 回答 7

3

简而言之,指针不是地址,它们是表示具有类型的地址的变量。因此,这些类型与要分配的指针兼容(void *通用指针除外)。

ptr2 = &ptr1;

ptr1有一个类型int *,所以&ptr1有一个类型int **,它不一样ptr2,有一个类型int *

参考:C99 6.5.16.1简单赋值

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

于 2013-07-16T15:02:50.847 回答
1

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

语言标准告诉编译器,如果有int *

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

如果有一个int **那么它会告诉它

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

这种情况一直持续下去,int ***以此类推。

希望这可以帮助您克服这种基本的困惑。

于 2013-07-16T18:03:30.997 回答
1

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

ptr2 = &ptr1;

尝试在没有演员int *表的情况下制作。int **C 标准禁止在没有显式转换的情况下进行此类转换。

不允许这样做的原因是标准不保证指针类型都具有相同的大小 - 因此指向指针的指针可能不适合您声明为指向int.

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

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

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

printf("%d\n",*(int *)ptr1);
printf("%d\n",*(int **)ptr2);
于 2013-07-16T15:00:07.597 回答
1

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

int **ptr3;
ptr3 = &ptr1;

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

于 2013-07-16T15:00:03.917 回答
1

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

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

于 2013-07-16T15:55:12.607 回答
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指针并完成它。

于 2013-07-16T16:02:10.230 回答
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 --.

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

于 2013-07-16T17:39:29.470 回答