我正在学习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是ascii代码' a'。
我希望结果97使用pnum
变量
所以我尝试了printf("%d", pnum)
,printf("%d", *pnum)
或其他人。
但我无法从pnum
和num
获得97。
如何使用pnum
或num
?
答案 0 :(得分:1)
您无法使用int *pnum
变量获得结果,因为它是一个指针,并且它没有指向int
值97.
事实上,你的程序在内存中没有存储int
值为97的位置;有一个存储char
值为97的地方,但你不能指向它的int
指针。当然,您可以在取消引用之前将pnum
转发回char*
,但这与您的第一个printf
相同:
printf("%d", *((char*)pnum));
如果您想将97转换为整数变量,请使用num
代替pnum
:
int num = *character;
这会将char
的{{1}}值转换为其'a'
代码(系统上的97)。现在您可以指向它,或直接打印结果:
int
答案 1 :(得分:1)
你可以参考: http://www.cplusplus.com/reference/cstdio/printf/
现在我们知道格式说明符:
所以,获取代码:
int main(void)
{
char * chrs = "abcd";
char * pnum = chrs;
int num = *chrs;
printf("%c - %d - %d \n", *chrs, num, *pnum);
return 0;
}
答案 2 :(得分:1)
通常,程序具有未定义的行为 。 根据C标准(6.3.2.3指针)
6任何指针类型都可以转换为整数类型。除了 之前指定的,结果是实现定义的。 如果 结果不能用整数类型表示,行为是 undefined。结果不必在任何值的范围内 整数类型。
例如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 *
,然后再将其转换为derefercen。
下面是一个演示程序,展示如何实现它。如果你不取消引用指针,那么将输出整个字符串文字。
#include <stdio.h>
#include <stdint.h>
int main(void)
{
char *character = "abcd";
printf( "%d\n", *character);
intptr_t num = ( intptr_t )character;
intptr_t *pnum = #
printf( "%s\n", ( char * )*pnum );
printf( "%d\n", *( char * )*pnum );
return 0;
}
程序输出
97
abcd
97