在下面的程序中,我通过为它分配NULL来创建* ptr。据我所知,* ptr = NULL;意思是,* ptr指向什么都没有。如果是这种情况,为什么ptr和& ptr给出不同的结果?
#include<stdio.h>
int main() {
int *ptr=NULL;
printf("%p \n",ptr);
printf("%p \n",&ptr);
}
输出:
0
0x7fff3415dc40
答案 0 :(得分:6)
('two')
包含您指定的值ptr
。
NULL
是变量&ptr
的地址,在您的情况下为ptr
答案 1 :(得分:5)
指针变量是对象,可以指向另一个对象。这里int *ptr = NULL;
将ptr
声明为指针对象,可能指向int
的对象。
最初存储在此指针对象中的值为NULL
(它初始化为NULL
,因此ptr
不指向任何对象。“ / p>
现在,ptr
在内存中驻留。它需要足够的字节来包含指向对象的地址。所以它也需要一个地址。因此
ptr
计算ptr
指向的对象的地址。&ptr
评估ptr
对象本身在内存中的位置*ptr
评估ptr
指向的对象的值(如果它指向某个对象)。如果它没有指向对象,则行为未定义。此外,%p
需要void *
作为相应的参数,因此打印它们的正确方法是
printf("%p\n", (void *)ptr);
printf("%p\n", (void *)&ptr);
答案 2 :(得分:1)
指针是一个地址。这样的地址需要存储空间。因此指针存储在特定地址。 所以&amp; ptr是存储指针的地方,ptr是它指向的值。所以你的指针地址是0x7ff ...,它的值为null,为零。
答案 3 :(得分:0)
打印指针时,应将其转换为void指针,如:
List<MongoCredential> creds = new ArrayList<MongoCredential>();
creds.add(MongoCredential.createCredential(username, dbName, password.toCharArray()));
MongoClientOptions.Builder optionsBuilder = MongoClientOptions.builder();
optionsBuilder.connectTimeout(Integer.parseInt(connectionTimeOut));
optionsBuilder.serverSelectionTimeout(Integer.parseInt(serverSelectionTimeOut));
optionsBuilder.socketTimeout(Integer.parseInt(socketTimeOut));
optionsBuilder.connectionsPerHost(Integer.parseInt(connections));
MongoClientOptions options = optionsBuilder.build();
mongoClient = new MongoClient(new ServerAddress(hostname, Integer.parseInt(port)), creds, options);
两个陈述之间的区别在于,第一个打印printf("%p \n",(void*)ptr);
^^^^^^^
的值,第二个打印ptr
的地址
考虑以下代码:
ptr
第一个int n=10;
printf("%d \n", d);
printf("%p \n", (void*)&d);
打印值10,第二个打印变量地址printf
使用指针变量执行相同的操作也是一样的。首先,您通过指针变量打印值hold,然后打印指针变量的地址。