C 不带printf%p的变量的输出地址

C 不带printf%p的变量的输出地址,c,printf,C,Printf,我是C编程的一年级学生,所以我的技能/知识有限。我正试图在printf上创建自己的实现,但在检索和打印变量地址时遇到了问题。使用printf,可以用%p输出变量的地址,我需要以某种方式复制%p 存储变量的地址时,数据类型为int*,我不知道如何将此地址写入屏幕(stdout) 例如: 现在,我如何输出地址(而不是I处的值)?我尝试使用原始的printf格式说明符进行测试。我尝试使用%x、%s、%d、%lu。。。当我试图输出一个int*(整数指针)时,这都给了我一个错误 有人能帮我输出地址吗?您只

我是C编程的一年级学生,所以我的技能/知识有限。我正试图在
printf
上创建自己的实现,但在检索和打印变量地址时遇到了问题。使用
printf
,可以用
%p
输出变量的地址,我需要以某种方式复制
%p

存储变量的地址时,数据类型为
int*
,我不知道如何将此地址写入屏幕(stdout)

例如: 现在,我如何输出
地址
(而不是
I
处的值)?我尝试使用原始的
printf
格式说明符进行测试。我尝试使用%x、%s、%d、%lu。。。当我试图输出一个
int*
(整数指针)时,这都给了我一个错误


有人能帮我输出地址吗?

您只能检查指针的位并使用类型unsigned char打印这些位:

unsigned char* a = ( unsigned char* )address;
for( size_t i = 0 ; i < sizeof( address ) ; i++ )
     printf( "%hhu" , a[i] );
unsigned char*a=(unsigned char*)地址;
对于(大小i=0;i

如果指针是指向对象的指针,另一个选项是将指针强制转换为类型:
intptr\u t
uintptr\u t
,但这些类型的可用性是由实现定义的。

您只能检查指针的位,并使用类型unsigned char打印这些位:

unsigned char* a = ( unsigned char* )address;
for( size_t i = 0 ; i < sizeof( address ) ; i++ )
     printf( "%hhu" , a[i] );
unsigned char*a=(unsigned char*)地址;
对于(大小i=0;i

另一个选项是,如果指针是指向对象的指针,则将指针强制转换为类型:
intptr\u t
uintptr\u t
,但这些类型的可用性由实现定义。

如果是针对对象的地址,则可以执行以下操作:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(void)
{
  int a;
  uintptr_t uip = (uintptr_t) ((void*) &a);
  printf("address of a = 0x%"PRIXPTR, uip);
}
#包括
#包括
#包括
内部主(空)
{
INTA;
uintptr_t uip=(uintptr_t)((void*)和a);
printf(“a=0x%的地址”PRIXPTR,uip);
}

要打印函数的地址,您需要转到。

如果是对象的地址,您可以执行以下操作:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(void)
{
  int a;
  uintptr_t uip = (uintptr_t) ((void*) &a);
  printf("address of a = 0x%"PRIXPTR, uip);
}
#包括
#包括
#包括
内部主(空)
{
INTA;
uintptr_t uip=(uintptr_t)((void*)和a);
printf(“a=0x%的地址”PRIXPTR,uip);
}

要打印函数的地址,您需要转到。

它们应该从C99开始可用。@Aconcagua这些类型是可选的,因此这取决于实现。它们应该从C99开始可用。@Aconcagua这些类型是可选的,因此,这取决于实现。我没有发现任何禁止将函数指针强制转换到uintptr\t的内容。我错过了什么吗?我已经错过了:任何指针类型都可以转换为整数类型。由于在其他规则中对对象指针类型和函数指针类型进行了区分,我认为任何指针类型都适用于这两种类型。@2502:好的,明白了:
intptr\u t
uintptr\u t
由标准保证只保留有效的
void*
(7.20.1.4/1)的值。由于拼写错误,函数不能转换为
void*
@2501:Sry。有趣的打字错误…;-)因此,我推断:强制转换为void*以前是过时的,您只需使用
(uintpttr\t)&a…我没有发现任何禁止将函数指针强制转换到uintptr\t的内容。我错过了什么吗?我已经错过了:任何指针类型都可以转换为整数类型。由于在其他规则中对对象指针类型和函数指针类型进行了区分,我认为任何指针类型都适用于这两种类型。@2502:好的,明白了:
intptr\u t
uintptr\u t
由标准保证只保留有效的
void*
(7.20.1.4/1)的值。由于拼写错误,函数不能转换为
void*
@2501:Sry。有趣的打字错误…;-)因此,我推断:强制转换为void*以前是过时的,您只需使用
(uintpttr\t)&a..@Anders K。这将在64位机器上剪切64位地址的上32位。@Anders K。这将在64位机器上剪切64位地址的上32位。