在c中为常量指针

时间:2016-03-28 07:28:10

标签: c pointers casting

我正在尝试运行此代码,但编译器会返回以下警告:

int c=23;
int *const a=&c;
printf("%d",(int)a);
  

警告:从指针强制转换为不同大小的整数[-Wpointer-to-int-cast]

 printf("%d",(int)a);

3 个答案:

答案 0 :(得分:0)

您已将a声明为常量指针,但您尝试将其打印为int。使用%p说明符打印指针的地址并将指针转换为void,如下所示:

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

答案 1 :(得分:0)

您收到警告,因为在类型不匹配后,编译器必须将其转换为打印它并且信息将丢失。

如果要打印指针的物理地址,请使用%p并将指针强制转换为void *

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

如果要打印指针的内容(指向它的内容),则必须取消引用它:

printf("%d", *a);

请记住,要访问内容,请使用*。否则,您使用指针,而不是其内容。获取非指针变量的地址:&

答案 2 :(得分:0)

c表示内存中的地址,它是整数的第一个字节 - 在本例中为数字23 a表示内存中的另一个地址,它是指针的第一个字节 - 在这种情况下保存c的地址(不是c中的值,因为你使用了& c表示其地址)

要以有意义的方式打印出来,printf必须使用指针格式%p

如果你使用这四个printf语句:

printf("%p\n", a);
printf("%p\n", &c);
printf("%d\n", *a);
printf("%d\n", c);
你会得到这样的东西:

0x7ffc080a3f24   ('a' contains a pointer which is the address of 'c')  
0x7ffc080a3f24   (&c is the address of 'c')  
23               (*a, dereferencing the pointer contained in 'a' provides the value held by the address held by 'a')  
23               (and 'c' is the value held at the address &c)

请注意,如果您这样做,也会收到警告:

printf("%p\n", (int) a);

警告:从指针强制转换为不同大小的整数[-Wpointer-to-int-cast]
因为您使用了正确的指针格式说明符' a',但您已将其转换为整数类型。虽然int和指针都是'整数'它们是不同大小的整数 如果忽略警告并运行代码,则打印的值不正确,但您可以看到它已被截断: 0x80a3f24