如何在c / c ++中获取指针的地址?

时间:2014-03-07 12:26:12

标签: c++ c

如何在 c / c ++ 中获取指针的地址?

例如:我有以下代码。

int a =10;
int *p = &a;

那么如何获取指针p的地址? 现在我要打印p的地址,我该怎么办?

print(“%s”,???)我传递给???。

10 个答案:

答案 0 :(得分:61)

获取p的地址:

int **pp = &p;

你可以继续:

int ***ppp = &pp;
int ****pppp = &ppp;
...

或者,只有在C ++ 11中,你可以这样做:

auto pp = std::addressof(p);

要在C中打印地址,大多数编译器都支持%p,因此您只需执行以下操作:

printf("addr: %p", pp);

否则你需要投射它(假设一个32位平台)

printf("addr: 0x%u", (unsigned)pp);

在C ++中你可以这样做:

cout << "addr: " << pp;

答案 1 :(得分:16)

int a = 10;

要获取a的地址,您可以:&aa的地址)返回int*(指向int的指针)

int *p = &a;

然后,您存储p类型为int*的地址。

最后,如果您执行&p,则会获得p的{​​{1}}类型的地址,即指向int的指针:

int**

刚看到你的编辑:

打印出指针的地址,你需要转换它:

int** p_ptr = &p;

或者如果您的printf支持它,请使用printf("address of pointer is: 0x%0X\n", (unsigned)&p); printf("address of pointer to pointer is: 0x%0X\n", (unsigned)&p_ptr);

%p

答案 2 :(得分:5)

&a提供a地址 - &p地址p

int * * p_to_p = &p;

答案 3 :(得分:2)

您可以使用%p格式化程序。在打印之前,最好先练习指针void*

C标准说:

  

参数应该是指向void的指针。指针的值以实现定义的方式转换为打印字符序列。

这是你如何做到的:

printf("%p", (void*)p);

答案 4 :(得分:1)

您可以在C

中使用%p

在C:

printf("%p",p)

在C ++中:

cout<<"Address of pointer p is: "<<p

答案 5 :(得分:1)

你可以用这个

在C

int a =10;
int *p = &a;     
int **pp = &p;
printf("%u",&p);

在C ++中

cout<<p;

答案 6 :(得分:1)

拥有这个C源:

int a = 10;
int * ptr = &a;

使用此

printf("The address of ptr is %p\n", (void *) &ptr);

打印ptr

的地址

请注意,转换说明符p是打印指针值的唯一转换说明符,它被定义为仅与void*类型指针一起使用。

来自man printf:

  

p

     

void * 指针参数以十六进制打印(如同                 按% #x 或% #lx )。

答案 7 :(得分:0)

C ++ 中,您可以执行以下操作:

// Declaration and assign variable a
int a = 7;
// Declaration pointer b
int* b;
// Assign address of variable a to pointer b
b = &a;

// Declaration pointer c
int** c;
// Assign address of pointer b to pointer c
c = &b;

std::cout << "a: " << a << "\n";       // Print value of variable a
std::cout << "&a: " << &a << "\n";     // Print address of variable a

std::cout << "" << "" << "\n";

std::cout << "b: " << b << "\n";       // Print address of variable a
std::cout << "*b: " << *b << "\n";     // Print value of variable a
std::cout << "&b: " << &b << "\n";     // Print address of pointer b

std::cout << "" << "" << "\n";

std::cout << "c: " << c << "\n";       // Print address of pointer b
std::cout << "**c: " << **c << "\n";   // Print value of variable a
std::cout << "*c: " << *c << "\n";     // Print address of variable a
std::cout << "&c: " << &c << "\n";     // Print address of pointer c

答案 8 :(得分:0)

首先,您应该了解指针并不复杂。指针显示变量的地址。

示例:

int a = 10;
int *p = &a;  // This means giving a pointer of variable "a" to int pointer variable "p"

并且,您应该了解“指针是地址”和“地址是数值”。因此,您可以将变量的地址获取为Integer。

int a = 10;
unsigned long address = (unsigned long)&a;

// comparison
printf("%p\n", &a);
printf("%ld\n", address);

输出低于

0x7fff1216619c
7fff1216619c

注意:

如果使用64位计算机,则无法通过以下方式获取指针。

int a = 10;
unsigned int address = (unsigned int)&a;

因为在64位计算机上指针是8个字节(64位),而int是4个字节。因此,您不能将8字节的内存地址分配给4字节的变量。

您必须使用long longlong来获取变量的地址。

  • long long始终为8个字节。
  • 在32位计算机上编译代码时,
  • long是4个字节。
  • 当为64位计算机编译代码时,
  • long是8个字节。

因此,您应该使用long来接收指针。

答案 9 :(得分:0)

如果您尝试从Linux终端编译这些代码,则可能会显示一条错误消息

期望参数类型为int

这是因为,当您尝试通过printf获取内存地址时,无法如视频中所示将其指定为%d。 与其尝试放入%p

示例:

// this might works fine since the out put is an integer as its expected.
printf("%d\n", *p); 

// but to get the address:
printf("%p\n", p);