为什么此变量等于数字和字符?

时间:2018-08-23 20:56:52

标签: c pointers

在此处调试此代码段时:

int main () {
   char str[] = "Stackoverflow";
   char a = *str;
   return 0;
}

为什么a显示为83 'S'

3 个答案:

答案 0 :(得分:5)

我认为您可能希望澄清不止一件事:

首先,指针str指向内存中字符值序列的第一个字符,即Sta,... 然后,*str取消引用此指针,即它读取str指向的字符的值。因此,*str产生S。 语句char a = *str将值S分配给类型a的变量char,该变量表示能够存储一个字符的一部分内存。通常,char是8位带符号(或无符号)整数值,因此,任何简单字符都由-127到+128(带符号的8位值的范围)之间的值表示。例如,根据ASCII,字符值S似乎表示为整数值83。系统定义系统是使用ASCII还是其他字符集,但是ASCII是当今最常见的字符集。 因此S83实际上是同一件事,只是当终端将值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;
}