使用&或*在C中分配指针的不同方法?

在C中,如果我想要一个指向变量的指针

int c = 12 ; int *p ; p = &c ;

或者我可以这样做

int c = 12; int p; p=&c; 在这两种情况下,p的值都是c的地址,请你告诉我将面临的问题。

你不能这样做:

 int c = 12; int p; p = &c; 

这对于将指针值赋给整数对象无效。 启用所有编译器警告,编译器必须为无效分配提供诊断消息。

在第一种情况下,没有问题,因为p是一种特殊类型的变量,它可以包含地址。 因此这里p被称为指针变量。

在第二种情况下, p是不能包含地址的正常标量变量 。 所以有一个问题。 隐式编译器将无法将c变量的地址分配给变量p

&*在不同的上下文中表示不同的东西。

&在变量声明中(包括在函数参数中)在C ++中表示“引用”或“通过引用”,在C中不允许。在C ++中,下面的j的类型是“int”。 它不会修改类型,但会说“这是现有数据的另一个名称”,而不是“为新数据创建空间”。

 int i = 5; int &j = i; //C++ only: j is another name for i int f(int & x); //f is a function that takes in an int by reference 

*在变量声明中表示“指针”。 int*的类型是“指向int的指针”,而int& (仅C ++)的类型是int 。 它修改了类型。

 int *p = NULL; //p is a pointer to an int, that currently points to nothing. int f(int & x); //f is a function that takes in an int by reference 

&在现有变量前面表示“指向”或“地址”。 它是一个操作符,可以被认为是一种特殊的function。 它接受任何东西并返回指向该东西的指针。

 int i = 5; int *p = &i; //p points to i int **pp = &p; //pp points to p 

*在现有变量前面意味着“这指向的是什么”,也称为解除引用运算符。 喜欢& ,它是一个运营商。 它只能应用于指针,并返回指针指向的内容。

 int i = 5; int *p = &i; //p points to i int j = *p; //j copies what p is pointing to 

所以如果我说*&var ,那就*&var一样,因为它意味着“取消引用指向var的指针”。

 int c = 12; int p; p=&c; 

引入了从c地址丢失位的风险。

如果你真的需要将地址存储为整数,那么使用uintptr_t作为目标整数类型,因为C标准保证它足够宽以存储地址:

 int c = 12; uintptr_t p; p = (void*)&c; 

uintptr_t来自

7.18.1.4能够保存对象指针的整数类型

1

以下类型指定一个带符号的整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void的指针,结果将比较原始指针:

使用intptr_t

以下类型指定一个无符号整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void的指针,结果将等于原始指针:

uintptr_t的

这些类型是可选的。

但是要将此整数转换回指向整数的指针,它需要通过(void*)

 int * pi = (void*)p;