C 基础知识

本文深入探讨C语言的关键概念,包括数据类型、常量、变量、结构体、共用体、枚举等内容,帮助读者理解C语言的基础要素及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要内容:
回顾C语言的基本元素标识符、关键字、数据类型、常量、变量、结构体、共用体、枚举、运算符、表达式、语句
掌握程序的基本结构


关于数据类型:

数据类型决定:
1. 占内存大小
2. 内存中的布局
3. 数据的行为


关于常量:

在程序运行过程中,其值保持不变的量叫常量。按所属数据类型分四种常量:整型常量 实型常量 字符型常量 字符串常量

实型常量,也称浮点数 表示方式一般有两种:

十进制形式:必须含有小数点 比如0.123 ,3.5

指数形式::(e或E之前必须有数字,指数必须为整数)如:12.3e3 ,123E2, 1.23e4。错误的写法:e-5 ,1.2E-3.5,e3。

实型常量默认是double的  。浮点数一般不是精确显示所以比较大小的时候一般 (f-2.6)>-1e-6 && (f-2.6)<1e-6 直接写成 f==2.6f是不对的

字符串常量是由 " "双引号括起来的,并且最后一位是'\0'. 用空格隔开的连续的字符串被视为一个串。比如char str[ ] = "Hello" "Yaphets"; str = "HelloYaphets"

使用const而不是宏来定义常量的好处:

1、const定义的常量编译器可以对其进行数据类型安全检查,而#define宏定义的常量却只是进行简单的字符替换,且有时还会产生边际效应(不如你愿)。所谓边际效应举例如下:#define N 100#define M 200 + N当程序中使用N*M 时,原本想要100 * (200+ N )的却变成了100 * 200 + N 。

2、有些调试程序可对const进行调试,但不对#define进行调试。

3、当定义局部常量时,const作用域仅限于定义局部常量的函数体内。但用#define时其作用域不仅限于定义局部常量的函数体内,而是从定义点到整个程序的结束点。


关于变量

变量运算中的隐式类型转换
什么情况下发生?
运算转换:不同类型数据混合运算时。规则:不同类型数据运算时先自动转换成同一类型。规则是由低到高、简单到复杂。
赋值转换:把一个值赋给与其类型不同的变量时。右服从左。float f = 1.0;int* p = malloc(sizeof(int));
函数调用:实参与形参类型不一致时转换,实参服从形参。
函数返回:服从返回值。

变量运算中的强制类型转换,强制转换得到所需类型的中间变量,原变量类型不变。

变量的定义和声明

变量声明:告诉编译器变量的类型、存储类型,不分配存储空间。extern int i;

变量定义:告诉编译器在此处分配存储空间创建变量。int i= 1;

同一变量定义只能一次,但是可以声明多次。


关于结构体

多个的数据组合成的一个整体,它是一种构造数据类型。

结构体变量访问方式:
1. 结构体变量名.成员名
2. 指向结构体变量的指针->成员名 pstu1->sex = 'M‘;//第二种
3. (*指向结构体变量的指针).成员名 (*pstu1).sex = ‘M‘;//第三种

特点:

可以对结构体变量整体初始化;
可以将一个结构体变量整体赋值给另一个结构体变量。
可以对整个结构体变量或各成员取地址;
不可以在定义结构体类型时让成员带有初值。
不可以判断两个结构体变量是否相等;

关于枚举的好处:

int i;
enum solution {a,b,c,d,max};//枚举常量a,b,c,d代表四种不同的解决方案
enum solution {a,b,c,d,e,max};//当需要增加解决方案时,for循环次数自动调整
for(i= 0;i<max;++i) //for循环次数和方案数量有关


关于共用体union

共用体与结构体不同之处在于:
共用体变量中各成员项共同使用同一存储空间
一个共用体变量所占内存单元数为其成员中占用内存单元最长者的长度。


关于运算符优先级

++   --和sizeof的优先级要高于四则运算并且是从右向左的,比间址运算*也要高


关于typedef

用自定义名字为已有数据类型命名。
类型定义一般形式:typedef 原有类型 新别名;

typedef没有创造新数据类型。typedef是定义类型别名,不能定义变量。typedef与define 不同。define 预处理时处理,简单字符置换。typedef编译时处理,为已有类型命名。

比如下面两种情况显然是不一样的

#define PINT int *
PINT p1,p2;

typedef int * PINT;
PINT p1,p2;

经常用于重定义strut和union等可以简化代码

typedefstruct student
{ int num;
int age;
} STU;
STU stu1; // struct student stu1;

typedefstruct student
{
int i;
char name[10];
}STU,*pSTU;

这个例子中定义了两个别名,这个技巧经常在头文件中使用




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值