C语言%d、%c与%hhd的区别,%p与%x的区别

1.printf(("%%d)=%d", a), 这里%% 可以输出%
2.sprintf的作用是将一个格式化的字符串输出到一个目的字符串中,而printf是将一个格式化的字符串输出到屏幕
3.
sprintf()最常见的应用之一莫过于把整数打印到字符串中,如:

char s[10];
sprintf(s, "%d", 123); //把整数123打印成一个字符串保存在s中
sprintf(s, "%8x", 4567); //小写16进制,宽度占8个位置,右对齐

4、函数名: gcvt()
功 能: 把浮点数转换成字符串
用 法: 如下

 char *gcvt(**double** value, **int** ndigit, **char** *buf);

例子:

#include <stdlib.h>
#include <stdio.h>
int main(void)
{
	char str[25];
	double dNum;
	int n = 5;//需要转化的位数
	//一般浮点数
	dNum = 9.876;
	gcvt(dNum, n, str);
	printf( "string = %s\n", str);
	// **输出** **string = 9.876**
}
//负数
dNum = -123.4567;
gcvt(dNum, n, str);
printf("string = %s\n", str);
// **输出** **string = -123.46**  **注意:四舍五入了**
//指数
dNum = 0.678e5;
gcvt(dNum, n, str);
printf("string = %s\n", str);
// **输出** **string = 67800**
return 0;
}

问题1:C语言%d与%hhd的区别,二 者在什么时候不能替换使用(什么时候替换使用后输出内容不同)?
解答:
%d:把输入解释成一个有符号十进制整数
%hhd:把整数读作signed char 或 unsigned char
输出类型不一样。

问题2: C语言%c,%hhd有什么区别
解答:
二者针对类型都是单字节整数,也就是char或者unsigned char。
不过%c在输入输出的时候,是按照字符操作的。
%hhd是按照整数操作。
举例来说,
同样输出值为48(字符0的ascii码值)。用%c输出就是0. 用%hhd输出就是48

问题3:C语言中 %p的含义,与%x的区别
格式控制符“%p”中的p是pointer(指针)的缩写。指针的值是语言实现(编译程序)相关的,但几乎所有实现中,指针的值都是一个表示地址空间中某个存储器单元的整数。

printf函数族中对于%p一般以十六进制整数方式输出指针的值,附加前缀0x。

int i = 1;
printf("%p",&i);

相当于:
int i = 1;
printf("0x%x",&i);

对于32位的指针,输出一般会是类似0xf0001234之类的结果。
但对于64位的指针,结果会不一样,所以建议打印指针就用%p,因为:
%p是打印地址的, 而%x是以十六进制形式打印, 完全不同
(指针的大小是不确定的,由实现决定。根据地址空间的大小,一般有16位、32位、64位的指针。尽管目前32位平台上的指针一般全是32位的,但旧的一些平台上可能有多种长度的指针)
下面是main中代码:

int arr[5] = {10,20,30,40,50};
int i = 0;
printf("数据:\n\n");
printf("十进制表示的数据:\n");
for(i = 0 ; i < 5 ; i++)
{
	printf("%d\t",arr[i]);
}
printf("\n\n指针形式十六进制表示的数据:\n");

for(i = 0 ; i < 5 ; i++)
{
	printf("%p\t",arr[i]);
}

printf("\n\n普通十六进制表示的数据:\n");

for(i = 0 ; i < 5 ; i++)
{
	printf("%x\t",arr[i]);
}
printf("\n\n\n地址:\n");

printf("\n\n十进制表示的地址:\n");

for(i = 0 ; i < 5 ; i++)
{
	printf("%d\t",&arr[i]);
}
printf("\n\n指针形式十六进制表示的地址:\n");

for(i = 0 ; i < 5 ; i++)
{    
	printf("%p\t",&arr[i]);
}
printf("\n\n普通十六进制表示的地址:\n");

for(i = 0 ; i < 5 ; i++)
{
	printf("%x\t",&arr[i]);
}
printf("\n");

代码结果: 

数据:

十进制表示的数据:
10      20      30      40      50

指针形式十六进制表示的数据:
0000000A        00000014        0000001E        00000028        00000032

普通十六进制表示的数据:
a       14      1e      28      32


地址:


十进制表示的地址:
9435912 9435916 9435920 9435924 9435928

指针形式十六进制表示的地址:
008FFB08        008FFB0C        008FFB10        008FFB14        008FFB18

普通十六进制表示的地址:
8ffb08  8ffb0c  8ffb10  8ffb14  8ffb18


————————————————
版权声明:本文为CSDN博主「小白tree」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43469047/article/details/100192467

 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值