Closed. This question needs details or clarity。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗?添加详细信息并通过editing this post阐明问题。
                        
                        3年前关闭。
                                                                                            
                
        
有关指针的问题。我知道在声明int* pn = &n中,pn被初始化为指向n内存地址的指针。但是,为什么我们不能只说int pn = &n?如果我们这样写,那与将变量pn设置为n的存储位置不一样吗?我不完全理解为什么*是必要的。

最佳答案

我认为您的问题可以归结为:当地址实际上只是整数时,为什么C中会有一个指针类型?有几个原因。


首先很明显,地址总线的大小可能与系统的整数类型不同,因此它可能不适合整数。附带说明一下,int类型是带符号的,因此出于这个原因,它也可能不适合存储地址,因为地址通常是无符号的。
也是因为我们想要一个独特的指针类型,它不能与纯整数疯狂地混合在一起。 C阻止您在指针之间进行整数之间的隐式转换。 int pn = &n行实际上不会编译,因为它违反了这种类型安全性(“简单赋值”规则)。一些编译器对此有点松懈,即使它违反了C标准。 (在GCC中,请确保已设置-pedantic-errors

而且由于我们有一个独特的指针类型,所以C还允许我们根据指向的类型执行指针算术,这非常方便。例如,它允许我们像使用数组一样使用指针。


现代C引入了两个新的可用于安全存储地址的整数类型:uintptr_tintptr_t。保证它们足够大以安全地存储地址,但是您仍然必须使用与指针类型的显式转换:

uintptr_t pn = (uintptr_t)&n;




intptr_t很有用,尽管在某些特殊情况下您实际上具有负地址。我相信某些系统上的某些虚拟内存寻址可能使用负地址来指示内核地址空间。)

关于c - C语言中int * pn =&n和int pn =&n有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36403298/

10-11 18:03