C语言 如何使用其他变量打印 ascii 代码?



我正在学习C语言。

这是我的代码

int main(void)
{
char * character = "abcd";
printf("%d n", *character);
int num = character;
int * pnum = #
printf("%s n", * pnum);
return 0;
}

我得到的结果是:97 和 abcd .

我了解到97是"a"的ascii代码。

我希望结果 97 使用pnum变量,

所以我尝试了printf("%d", pnum)printf("%d", *pnum)什么的。

但是我还不能从pnumnum那里得到97分。

如何使用pnumnum获得 97

通常,程序具有未定义的行为 . 根据C标准(6.3.2.3指针)

6 任何指针类型都可以转换为整数类型。除了 前面指定的结果是实现定义的。如果 结果不能用整数类型表示,行为是 定义。结果不必在任何值的范围内 整数类型。

例如,sizeof( char * )可以等于 8,而sizeof( int )可以等于 4。该对象类型int可能无法存储指针的值。

而不是此声明中的类型int

int num = character;

应使用标头中声明的类型intptr_t<stdint.h>

例如

#include <stdint.h>
//...
intptr_t num = ( intptr_t )character;

所以现在变量num包含字符串文字"abcd"的第一个字符的地址。

在此声明之后

intptr_t *pnum = &num;

指针pnum具有变量num的地址。

现在要输出字符串文字的第一个字符,您首先必须取消引用指针pnum该指针以获取存储在变量num中的值。此值表示字符串文本的第一个字符的地址。您需要将其强制转换为类型char *并再次取消引用它。

下面是一个演示程序,展示了如何实现它。如果不取消引用指针,则将输出整个字符串文本。

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

int main(void) 
{
char *character = "abcd";
printf( "%dn", *character);
intptr_t num = ( intptr_t )character;
intptr_t *pnum = &num;
printf( "%sn", ( char * )*pnum );
printf( "%dn", *( char * )*pnum );
return 0;
}

程序输出为

97
abcd
97

您无法使用int *pnum变量获取结果,因为它是一个指针,并且它不指向int值 97。

事实上,程序内存中没有存储int值 97 的位置;有一个存储char值 97 的位置,但不能将int指针指向它。当然,在取消引用之前,您始终可以将pnum转换回char*,但这与您的第一printf相同:

printf("%d", *((char*)pnum));

如果要将 97 放入整数变量中,请使用num而不是pnum

int num = *character;

这会char'a'的值转换为其int代码(系统上为 97)。现在您可以指向它,或直接打印结果:

int *pnum = &num;
printf("%d %dn", num, *pnum);

你可以参考: http://www.cplusplus.com/reference/cstdio/printf/

现在我们知道了格式说明符:

  • d 有符号十进制整数
  • i 有符号十进制整数
  • u 无符号十进制整数
  • o 无符号八进制
  • x 无符号十六进制整数
  • X 无符号十六进制整数(大写)
  • f 十进制浮点数,小写
  • F 十进制浮点数,大写
  • e 科学记数法(尾数/指数),小写
  • E 科学记数法(尾数/指数),大写
  • c 字符
  • s 字符串
  • p 指针地址

因此,获取代码:

int main(void)
{
char * chrs = "abcd";
char * pnum = chrs;
int num = *chrs;
printf("%c - %d - %d n", *chrs, num, *pnum);
return 0;
}

最新更新