我正在学习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)
什么的。
但是我还不能从pnum
和num
那里得到97分。
如何使用pnum
或num
获得 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 = #
指针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 = #
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 = #
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;
}