在此处调试此代码段时:
int main () {
char str[] = "Stackoverflow";
char a = *str;
return 0;
}
为什么a
显示为83 'S'
?
答案 0 :(得分:5)
我认为您可能希望澄清不止一件事:
首先,指针str
指向内存中字符值序列的第一个字符,即S
,t
,a
,...
然后,*str
取消引用此指针,即它读取str
指向的字符的值。因此,*str
产生S
。
语句char a = *str
将值S
分配给类型a
的变量char
,该变量表示能够存储一个字符的一部分内存。通常,char
是8位带符号(或无符号)整数值,因此,任何简单字符都由-127到+128(带符号的8位值的范围)之间的值表示。例如,根据ASCII,字符值S
似乎表示为整数值83。系统定义系统是使用ASCII还是其他字符集,但是ASCII是当今最常见的字符集。
因此S
和83
实际上是同一件事,只是当终端将值83
解释为要打印为字符时,它会打印S
。反之,如果我们将S
解释为整数值,则终端将打印83
:
#include <stdio.h>
int main() {
printf("'S' as integral value: %d\n", 'S');
printf("83 as character value: %c\n", 83);
char c1 = 'S';
char c2 = 83;
if (c1 == c2) {
printf("c1 and c2 are equal.\n");
} else {
printf("c1 and c2 are not equal.\n");
}
}
输出:
'S' as integral value: 83
83 as character value: S
c1 and c2 are equal.
答案 1 :(得分:3)
83是大写字母s的ASCII代码。
*str
等同于写入str[0]
,因此在这种情况下,数组str
的第一个内存插槽对应于字符'S'
答案 2 :(得分:1)
计算机将一切都理解为数字:字符,字符串,照片,视频,音频等。一切都是计算机内部的数字,因此人们想知道如何表示字符。
由于这个事实,他们决定将字符编码为数字,以便每个字符都有一个对应的数字在计算机内部对其进行编码。
在整个历史中,已经制定了许多字符编码方案(字符和数字之间的匹配项),但是其中一种非常著名,并且几乎在任何地方都使用过:它称为ASCII字符编码。 ASCII是一种7位编码,表示除某些其他符号外的所有数字字符和拉丁字母字符(大写和小写)。
默认情况下,您的系统向C程序提供ASCII输入,因此,在内部,此输入按照ASCII标准所说存储在内存中。例如,当您在键盘上键入A时,键盘会向您的计算机发送值65(这是ASCII标准中字符A的十进制值。在内部,它以1000001101的序列发送,因为计算机以二进制形式工作)。程序。您的程序将此值(65)存储在变量(char c;
)指定的存储位置内。当您要求计算机打印此字符时,它将检查存储在字符变量中的ASCII值,然后找出一种在屏幕上绘制匹配符号的方法。
在C语言中,字符串只是字符的序列(或数组)。当您持有一个指向字符串的指针时,它实际上指向该字符串的第一个字符(字符数组)。如果将指针前进1,则将指向第二个字符,依此类推。因此,如果取消引用原始指针(指向第一个字符),则将获得存储在该位置(第一个位置)的字符的ASCII值,因此在您的情况下,您将获得83,它对应于符号'S '。
下面的程序显示了所有ASCII字符及其图形表示形式:一些字符可能没有视觉表示,因为它们用于控制输入和终端,尤其是前几个字符(前34个值)。
#include <stdio.h>
int main ()
{
/* Unsigned to avoid integer overflow in the loop below */
unsigned char c;
/* ASCII is 7-bit so it can represent
2^7 = 128 (from 0 to 127) symbols */
for (c = 0; c < 128; c++)
printf ("ASCII value of %c = %d\n", c, c);
return 0;
}