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

时间:2013-12-08 10:38:23

标签: c pointers

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

的指针

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

或者我可以这样做

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

4 个答案:

答案 0 :(得分:4)

你不能这样做:

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

&*在不同的环境中表示不同的内容。

变量声明中的

&(包括在函数参数中)在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
现有变量前面的

&表示“指向”或“地址”。它是一个操作符,可以被认为是一种特殊的功能。它接受任何东西并返回指向该东西的指针。

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的指针”。

答案 3 :(得分:0)

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

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

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

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

uintptr_t来自<stdint.h>

  

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

     

1

     

以下类型指定带有任何有效属性的有符号整数类型   指向void的指针可以转换为这种类型,然后转换回指向void的指针,   并且结果将与原始指针进行比较:

     

<强>使用intptr_t

     

以下类型指定无符号整数类型,其属性为any   指向void的指针可以转换为这种类型,然后转换回指向void的指针,   并且结果将与原始指针进行比较:

     

<强> uintptr_t的

     

这些类型是可选的。

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

int * pi = (void*)p;