在C中,如果我想要一个指向变量
的指针 int c = 12 ;
int *p ;
p = &c ;
或者我可以这样做
int c = 12;
int p;
p=&c;
在这两种情况下,p值都是c的地址,请你告诉我将面临的问题。
答案 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;