NULL指针的地址

时间:2017-10-22 07:55:11

标签: c pointers null

在下面的程序中,我通过为它分配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 

4 个答案:

答案 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,然后打印指针变量的地址。