使用&或*在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;