C语言变量与数据类型深度解析(附实战案例)

       在C语言编程中,变量和数据类型是构建程序的基石。掌握它们的特性与使用规则,是写出高效、可靠代码的前提。本文将结合实例,详细讲解C语言中变量的定义、数据类型的分类及内存存储机制,适合初学者系统学习。

一、变量的核心概念

  • 1.概念

    •         在程序运行过程中值可变的量。
      •         变量代表内存中(栈内存)具有特定属性的一个存储单元,它是用来存储数据的,也就是存放变量的值。
  • 写法:数据类型 变量名 = 初始化值      int count = 0
  • 变量名其本质上就是固定大小内存的别名,通过变量名能够找到这个数据,也就能找到这个数据所在的内存空间。
  • 内存空间最小的单位是bit,但是太小了,常用字节作为单位,进行编号,这个编号叫做地址。
  • 程序在运行时,系统会给这个程序分配一个内存地址。

2.举例

#include <stdio.h>

int main(int argc,char *argv[])
{
    //声明变量并初始化
    int age = 21;
     //先声明,再赋值
    int count;
    count = 10;
    //声明和赋值并行
    int number = 12;
    printf("%d\n",number);

    number = 22;//会覆盖掉原来的number的值,常量12还在,变量空间中为22

    printf("%d\n",number);
    //多个变量为同一类型,变量之间用“,”分隔

    int a,b=10,c;//定义和赋值一起表示初始化

    printf("%d\n,%d\n,%d\n",a,b,c);//访问初始化的变量,数据是随机分配的

    return 0;
}

3.变量名的命名规范

变量名作为标识符的一种,需遵循以下规则:

1.由字母、数字、下划线组成,且必须以字母或下划线开头(如`_num`、`student1`)

2.区分大小写(`count`与`Count`是两个不同变量)

3.不能与关键字(如`int`、`if`)或预定义标识符(如`printf`)重名

**命名建议**:

变量名和函数名:小写字母+下划线(如`set_score`)

常量名和枚举名:大写字母+下划线(如`MAX_SIZE`)

4.标识符

  • 定义:用来表示对象名字的有效字符。对象包括变量、常量、函数、数组、构造类型等。 也就是标识符是这些对象的名字。
  •  构成: C语言规定的标识符只能由字母、数字、下划线三种字符构成。且只能以下划线或者 字母开头。如:_int,num 
  • 编译系统对字母的大小写敏感(区分大小写)。变量名和函数名一般用小写字母+下 划线,常量名和枚举名一般用大写字母+下划线,举例:
变量:set_count setCount(C语言也支持,但是不推荐)
函数:set_count() setCount()(C语言也支持)
常量、枚举:SET_COUNT

C语言中有三类标识符:

1.关键字

        有32个,系统由特定的含义和用途,不能用作自定义标识符:

auto break case char const continue default do double else enum
extern float for goto if int long register return short signed
sizeof static struct switch typedef union unsigned void
volatile while
2.系统预定义的标识符

        如系统提供的函数名sim,printf,main,scanf等以及预处理指 令include,define等。

        C语言中有12个预处理指令:

define endif elif error line include ifdef ifnodef pargma undef
if else

        注意:以上预处理指令使用的时候,在前面需添加 # ,如 #include

3.用户标识符

        用户定义的标识符,用来给变量、自定义函数、符号常量、数组、 构造类型、文件等命名。在C语言中,对所使用的变量,先定义后使用。

使用

// 写法1:一个类型说明语句可以同时定义多个类型的变量
// 优点:简洁
// 缺点:可读性较差
int a, b, c, d; // 定义多个同类型变量,这是一种简略写法
int a1 = 3, b1 = 4, c1 = 5, d1 = 6;
// 写法2:多个同类型的变量也可以用多个类型说明语句
// 优点:可读性强
// 缺点:繁琐
int aa;
int bb;
int cc;
int dd;
int aa1 = 3;
int bb1 = 4;
int cc1 = 5;
int dd1 = 6;

        同类型说明语句定义的变量只是为这些变量分配了内存空间。以便以存放与之相同类 型的数据。在未对这些变量赋值前,这些变量中的值是随机的(具体的随机由内存状 态来决定),在C标准中访问未初始化的变量是“未定义行为(UB)”

/*****************************************************************
********
> File Name: demo02.c
> Author: 千夕
> Description:
> Created Time: 2025年07月09日 星期三 11时00分52秒
******************************************************************
******/
#include <stdio.h>
int main(int argc,char *argv[])
{
int a, b, c, d;
printf("%d,%d,%d,%d\n",a,b,c,d);// 此时的变量访问,属于 未定义行
为(UB),不建议这样作
return 0;
}
// 第一次运行结果:-1543118880,32767,0,0
// 第二次运行结果:243305312,32766,0,0

        C语言允许定义变量的同时为变量赋初始值。

        在为长整型变量初始化或者赋值时,如果被复制的数据为基本整型常量,则C编译系统自动将被复制数据转换为与之相依变量类型一致的数据。

long a = 12L; // 将一个long类型的常量数据12赋值给long类型的变量a,=
左右两边类型一致
long b = 12; // 将一个int类型的常量数据12赋值给long类型的变量b,此时
=左右两边类型不一致

        整型变量所占的字节数有限,因此,他们存储的整数有一定的范围

二、基本数据类型详解

1.整形数据

        用来存放整形数据的变量

        我们可以通过变量名访问变量空间

        若忘记了C编译系统对变量分配的存储空间大小,可以通过sizeof运算符查询,如:

int i = 10;
printf("%d,%d\n",sizeof(int),sizeof(a)); // 4,4,sizeof返回的大小是以字节为单位,返回类型long uns igned int

整形数据在内存中的存储形式:

        数据在内存中以二进制形式存放

short i;   // 定义一个存储整型的变量 2 字节,默认是有符号数
i = 10;
printf("%d\n",i)

        十进制转二进制,使用辗转相除法,则整数10在内存中的实际存储型式为:

        整形数据在内存中是以形式表示的,使用补码主要是为了我们程序中的数据直接转换出来的二进制是原码形式的

        正数的补码和原码相同,反码是原码和补码转换的过程产物,三码唯一。

        负数的补码:符号位不变,数值位取反加一。

        内存数据的读写:

                ①存数据在内存中:;程序原始数据-->二进制原码-->二进制反码-->二进制补码

                ②从内存中取数据:二进制补码->二进制反码-->二进制原码-->程序原始数据

#include <stdio.h>

int main(int argc,char *argv[])
{
    //定义有符号整型变量、0、负数,默认就是有符号数
    int a,b,c,d;,
    //定义有符号整型变量,可以存防正数、0,不能存放负数,必须添加关键词unsigned
    unsigned int u;

    //赋值
    a = 12;
    b = -24;
    u = 10;
    c = a + u, d = b + u;
    printf("a+u=%d,b+u=%d\n",c,d);
    //硬件支持加法运算,不支持减法运算,程序中的减法运算,实际上是5+(-2)
    return 0;
}

2.浮点型(小数类型)

        定义:用来表达实数(小数)的数据类型。

        浮点型变量的分类:

单精度浮点型(float):在64位系统中尺寸是4字节,精确到小数位6位,格式化符号%f

双精度浮点型(double):在64位系统中尺寸是8字节,精确到小数位15~16位,格式化符号%lf

长双精度浮点型(long double):在Linux下64位尺寸是16字节。

**注意:占用内存越多,能表示的精确度越高**

float f1 = 12.25f; //单精度
double f2 = 12.5; //双精度
long double f3;//长双精度

        浮点型的内存存储:

        指数形式(IEEE 754标准)存放,分为尾数部分和小数部分分别存放。

类别字节数指数位尾数位指数偏移
单精度浮点数48位【30~23】23位【22~00】127
双精度浮点数811位【62~52】52位【51~00】1023

示例:将27.5转换为float类型存储

1.二进制形式:`11011.1`

2.规范化为:`1.10111×2⁴`

3.指数计算:`4+127=131`(二进制`10000011`)

4.尾数:`10111`补0至23位→`10111000000000000000000`

5.组合结果:符号位(0,正数)+指数位+尾数位→32位二进制

※ 科学计数法(指数法):

C语言中一般浮点数有两种表示形式:

        十进制形式:指的是数字必须以整数形式+小数形式组成,比如 10.0 、3.14 ...... 符合规则,以10为底数,并且科学计数法要在范围值之内。

        指数形式(科学记数法):一般数学上对于小数可以以10为底进行表示 比如3.14 * 10²,但是在使用英文半角输入法的时候没办法输入上底或者下底,所以C语言 规定以字母e或者E来表示指数,并且要求字母e或者E的前面必须有数字,字母e 或者E的后面必须为整数。 -3.14E-2 2E-3 0.3E4

printf("%e", 10000000.00);

所以:           

                                       E3 错误 因为E的前面有数据 比如说 3.14E

3 3.1e5.6 错误 因为 E的后面必须是整数

3.1e-2 对的 相当于  3.1 * 10^-2^

1.01e-5 等价于 1.01 * 10^-5^

3.字符型(char)

        字符型变量用于存储单个字符,占用1字节内存,本质上存储的是字符对应的ASCII码。

char 变量列表;

举例

char a = 'A';
char b = a;
#include <stdio.h>

int main(int argc,char *argv[])
{
    char c1,c2;

    c1 = 'A';
    c2 = 'B';

    printf("c1=%c\n",c1);
    printf("c1=%c\n",c2);
    printf("c1=%d\n",c1);
    printf("c2=%d\n",c2);
    return 0;
}

运行结果:

一个字符变量只能存放一个字符,1字节。(一个字符 = 1字节)

4.字符数据在内存中的存储形式

        将字符常量存入字符变量,并不是把其本身存入内存中,而是将该字符的ASCII码存入内存单元。

char c1 = 'a' , c2 = 'b';

案例:

ASCII码:   a:97   b:98

 需求: char c1 = 'a', c2 = 'b'; 

分析: 'a' 的ASCII为 97 , 'b' 的ASCII码为 98 ,它们在内存中的存储形式:

案例 

* 要求:给字符变量赋整数值

#include <stdio.h>
int main(int argc,char *argv[])
{
char c1,c2;
c1 = 97;// char既能赋值字符,也能赋值整数(ASCII码)
c2 = 98;
printf("%c %c \n",c1,c2);// a b, 以字符形式输出
printf("%d %d \n",c1,c2);// 97 98, 以整数形式输出
return 0;
}

        说明:char类型可以赋值为字符,也可以赋值为整数(char a = 128,显示的结果范 围:-128~127),演示案例:

案例

 需求:大小写字母转换 

代码:

#include <stdio.h>
int main(int argc,char *argv[])
{
char c1,c2;
c1 = 'm';
c2 = 'Y';
printf("转换前:%c,%c\n",c1,c2);
// 转换
c1 = c1 - 32;
c2 = c2 + 32;
printf("转换后:%c,%c\n",c1,c2);
return 0;
}

三、实用技巧与注意事项

1.sizeof运算符:查询类型或变量占用的字节数

int a=10;

printf("int类型字节数:%zu\n",sizeof(int));//输出:4

printf("变量a字节数:%zu\n",sizeof(a));//输出:4

注意:`sizeof`返回值类型为`size_t`(无符号整数),建议用`%zu`格式化输出。

2.浮点型的指数表示法:

        格式:`数字e|E整数`(如`3.14e2`表示3.14×10²)

        规则:e/E前后必须有有效数字,后面必须是整数(如`3e-2`正确,`e3`、`3.1e5.6`错误)

3.有符号与无符号的区别:

        有符号数(默认):最高位为符号位(0正1负),可表示正负值

        无符号数(加`unsigned`):所有位均为数值位,仅表示非负值

        示例:`unsigned char`范围0~255,`char`范围-128~127

总结

        本文详细介绍了C语言变量的定义、数据类型的分类及内存存储机制,核心要点包括:

-变量是内存存储单元的别名,需先定义后使用

-数据类型决定了变量的内存大小和取值范围

-整型以补码存储,浮点型以IEEE754标准存储,字符型以ASCII码存储

        掌握这些基础知识,是进行C语言编程的第一步。建议结合实例多做练习,加深对内存存储的理解,为后续学习指针、结构体等内容打下基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值