C 我可以直接给指针变量赋值吗?

C 我可以直接给指针变量赋值吗?,c,C,因为地址是数字,可以分配给指针变量,所以我可以直接将任何整数值分配给指针变量,如下所示: int *pPtr = 60000; 可以,但除非您正在为具有已知内存地址的嵌入式设备开发一个编译器,该编译器明确允许它,否则尝试取消引用这样的指针将调用未定义的行为 您只需指定变量的地址或内存分配函数的结果,如 Malc ,或 null < < /P> < P>,根据指针转换规则,如在线C++标准草案中所描述的,任何整数都可以转换为指针值: 6.3.2.3指针 (5) 整数可以转换为任何指针类型。除了

因为地址是数字,可以分配给指针变量,所以我可以直接将任何整数值分配给指针变量,如下所示:

int *pPtr = 60000;

可以,但除非您正在为具有已知内存地址的嵌入式设备开发一个编译器,该编译器明确允许它,否则尝试取消引用这样的指针将调用未定义的行为


您只需指定变量的地址或内存分配函数的结果,如<代码> Malc ,或<代码> null < < /P> < P>,根据指针转换规则,如在线C++标准草案中所描述的,任何整数都可以转换为指针值:

6.3.2.3指针

(5) 整数可以转换为任何指针类型。除了作为 以前指定,结果是实现定义的,可能不是 如果正确对齐,则可能不会指向引用对象的实体 类型,并且可能是陷阱表示形式


但是,允许转换并不意味着允许您取消对指针的引用。

您可以这样做,但需要考虑很多因素

1) 这是什么意思

在实际使用时,唯一真正有用的抽象是您需要访问特定的内存位置,因为某些内容映射到特定的点,通常是硬件控制寄存器(较少使用:闪存中的特定区域或链接器表)。您正在分配60000(一个十进制数字,而不是十六进制地址或符号助记符)这一事实让我非常担心

2) 你有“奇怪”的指针吗

一些微控制器的指针具有奇怪的语义(近对远,绑定到特定内存页等)。您可能需要做一些奇怪的事情才能使指针有意义。此外,一些指针可以根据其指向的位置执行奇怪的操作。例如,PIC32系列可以指向完全相同但具有不同高位的数据,以检索缓存副本或未缓存副本

3) 该值是否为指针的正确大小

不同的架构需要不同的大小。较新的数据类型,如intptr\t,是为了掩盖这一点。

是的,您可以。
您应该只分配变量的地址或内存分配函数(如malloc或NULL)的结果。

您可以这样做,是的。但这并不意味着它是有意义的。你可以,但不能以你的方式int*p=10;int*p*p=&10;我可以为你工作。但是考虑内存位置可能无法访问。@ EsmaeelE ->代码> *P=和10;<代码>将不起作用,因为您无法获取C中整数常量的地址。即使可以,一个
int
也可能无法保存该值。最后,
int*p=10
声明指向
int
的指针,并将值
10
存储在该变量中<代码>int*p*p=&10尝试使用未初始化的指针
p
,导致未定义的行为。事实上,根据标准,IIRC甚至只是创建一个指向无效地址的指针都是UB(尽管这实际上导致问题的平台非常罕见)。@MatteoItalia Ahhh。。有趣的是,在这样的系统中,所有指针在创建时都需要用有效地址初始化?对“int-ptr=&ptr”是否适用于此?我之所以这样问是因为@MartinJames:我怀疑没有初始化指针不会有问题(而且C标准要求它工作);问题的核心是,当指针加载到指针寄存器中时,这些机器会验证指针,因此,如果加载/计算无效指针,它们会捕获;如果你只是让指针保持未初始化状态,只要你不看它,你就没事了(你唯一能做的就是用空指针或有效指针覆盖它的内容)。如果你感兴趣,你可以看看和。