函数定义可以任何次序出现在一个或多个源文件中,但同一函数不可以分割在多个文件中;
对于主函数main而言,return返回值为0表示正常终止,非0则表示非正常终止【出现异常或出错结束程序】
Void显式说明该函数不返回任何值
从技术角度来看,地址就是指向变量的指针
在c中,人们通常把变量和函数的extern声明放在一个单独的文件中,习惯上称之为头文件【.h】
C中,被调用函数不能直接修改主调函数的值,只能修改其私有临时副本的值;
ASCII码表:字母(包括大写)以及一些常用的符号没法表示,因此约定一套编码来表示这些符号;
计算机在存储数据和执行指令的时候是以8个比特(bit)为单位的,也就是1个字节(byte),
bit(比特),即 存放一个1或者0的空间。
sizeof操作符来计算不同数据类型在内存中所占空间的大小,单位是字节(byte);
不同的数据类型有不同的输出格式
%d - 打印整形
%c - 打印字符
%f - 打印浮点型 - 小数
%p - 以地址形式打印
%x - 打印16进制数字
%s - 打印字符串
全局变量:定义在代码块{}之外的变量;
局部变量:定义在代码块{}之内的变量;
全局变量与局部变量名相同,局部变量优先。
作用域:限定这个名字的可用性的代码范围就是这个名字的作用域;
1、局部变量的作用域是变量所在的局部范围。
2、全局变量的作用域是整个工程。
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段;
1、局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
2、全局变量的生命周期是:整个程序的生命周期。
常量类型:1.字面常量【程序中出现的数字,字符等,10 和 w 就是字面常量。】
2.const修饰的常变量【const修饰的常变量无法修改】
3.#define定义标识符常量【define定义的常量不能被修改,这种定义方式相当于给字面常量起别名,它的别名具有字面常量的属性,在使用时别名直接替换为字面常量
e.g. #define name stuff这里的name在代码中就可以完全替代后面的stuff。***define定义标识符常量如果要换行的话千万不能用空格换行,必须用续航符' \ '来换行,并且注意,不能在续航符后面加空格,在define定义标识符的时候,建议不要加上分号.】
4.枚举常量【通过枚举关键字enum定义的常量。一般形式为:
enum名{枚举元素1,枚举元素}】
字符串:由双引号引起来的一串字符称为字符串字面值【单个字符只用单引号括起来】,或者简称字符串。注:字符串相当于多个字符连续存放在字符数组中,但是字符串的结尾是一个隐藏的\0 转义字符。在计算字符串长度的时候\0 是结束标志,不算作字符串内容,\0对于字符串非常重要,在打印字符串时,\0可以使打印停止。当字符数组的大小比我们存入数组的字符串大时,多出的空间会全部补为\0。【高中生物编译中终止子】
转义字符
常见关键字
- typedef 顾名思义是类型定义,这里应该理解为类型重命名。
//将unsigned int 重命名为uint_32, 所以uint_32也是一个类型名
typedef unsigned int uint_32;
2. 在C语言中: static是用来修饰变量和函数的;
1、修饰局部变量-静态局部变量;【static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束, 生命周期才结束】
2、修饰全局变量-静态全局变量;【一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。】
3、修饰函数-静态函数;【一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。】
***源文件其实就是纯文本文件,它的内部并没有特殊格式,源文件后缀大都根据编程语言本身的名字来命名。
#define 定义常量和宏
#defne 宏名(被替换的内容)(要替换的内容)
Eg.#define ADD(x,y) ((x)+(y))
指针
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节(byte)。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
1.地址的取出
变量都有地址, &操作符可以将变量的地址取出,然后赋值给指针。
#include <stdio.h>
int main()
{
int num = 10;
#//取出num的地址
//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n", &num);//打印地址,%p是以地址的形式打印
return 0;
}
- 地址的存储
需要定义指针变量【也有地址】
#include <stdio.h>
int main()
{
int num = 10;
int* p = #
*p = 20; //*是解引用操作符,*p是通过p找到p指向的对象,即num
return 0;
}
总结如下:
我们取出一个变量的地址的时候,这个地址便称为 指针;
而这个地址如果要存起来的话,需要存到一个变量里面去,这个变量就被称为 指针变量;
指针变量可以对它进行 解引用【解引用是指:通过指针,找到对应的内存和内存中的数据。】 操作;指针是一个变量,用来存放地址;指针大小在32位平台是4个字节,64位平台是8个字节。
//关于*的特别说明
*在C/C++中还有一个名字就是“解引用”,但需要注意的是,在变量声明的时候,*不能当做解引用使用,只是表示你声明的变量是一个指针类型。Eg. *p=5;//这就是解引用,*解释了 p对常量 5的内存地址的引用,解释结果就是直接去寻找p所指内容,因为p指向a,所以a的内容将被修改为5,而不是50。
//关于&的特别说明
& 在C/C++中具体 3种语义, 按位与,取地址 和声明一个引用。
int a=0x0000002 & 0x00000003;//按位与
int *p=&a;//取地址,取出a在内存中的地址给p,这样就建立一个指针映射,使得p指a
int &a=b;//声明a是b的引用,对a操作修改也就是直接对b修改。
在指针操作中,&还有一种叫法叫做“脱去解引用”在这个表达式中&*p(假设p是指针),&脱去了*对p的解引用,从而得到抵消的效果,得到应该是p所指的变量的地址。
结构体
结构体使得C语言有能力描述复杂类型结构体,它就将不同类型的数据存放在一起,作为一个整体进行处理。结构体在函数中的作用不是简便,其最主要的作用就是封装。封装的好处就是可以再次利用。[在C语言中,结构体不能包含函数。!!!]
//声明一个结构体
struct book
{
char title[MAXTITL];//一个字符串表示的titile 题目 ;
char author[MAXAUTL];//一个字符串表示的author作者 ;
float value;//一个浮点型表示的value价格;
};//注意分号不能少,这也相当于一条语句;
//我们有时候也将结构体声明叫做模板,因为它勾勒出数据该如何存储,并没有实例化数据对象。
C语言结构体定义的三种方式
- 最标准的方式:
#include <stdio.h>
struct student //结构体类型的说明与定义分开。声明
{
int age; /*年龄*/
float score; /*分数*/
char sex; /*性别*/
};
int main ()
{
struct student a={ 20,79,'f'}; //定义
printf("年龄:%d 分数:%.2f 性别:%c\n", a.age, a.score, a.sex );
return 0;
2.不环保的方式[最不环保的方式,是可以使用多次的]
#include <stdio.h>
struct student /*声明时直接定义*/
{
int age; /*年龄*/
float score; /*分数*/
char sex; /*性别*/
/*这种方式不环保,只能用一次*/
} a={21,80,'n'};
int main ()
{
printf("年龄:%d 分数:%.2f 性别:%c\n", a.age, a.score, a.sex );
- 最奈何人的方式
#include <stdio.h>
struct //直接定义结构体变量,没有结构体类型名。这种方式最烂
{
int age;
float score;
char sex;
} t={21,79,'f'};
int main ()
{
printf("年龄:%d 分数:%f 性别:%c\n", t.age, t.score, t.sex);
return 0;
}
return 0;
}
}
EXTERN
- 引用同一个文件中的变量
#include<stdio.h>
int func();
int main()
{
func(); //1
extern int num;
printf("%d",num); //2
return 0;
}
int num = 3;
int func()
{
printf("%d\n",num);
}
二、引用另一个文件中的变量[extern这个关键字的真正的作用是引用不在同一个文件中的变量或者函数。extern关键字只需要指明类型和变量名就行了,不能再重新赋值,初始化需要在原文件所在处进行,如果不进行初始化的话,全局变量会被编译器自动初始化为0,只有当一个变量是一个全局变量时,extern变量才会起作用.]
#include<stdio.h>
int main()
{
extern const int num;
printf("%d",num);
return 0;
}
#include<stdio.h>
const int num=5;
void func()
{
printf("fun in a.c");
}
- 引用另一个文件中的函数
#include<stdio.h>
int main()
{
extern void func();
func();
return 0;
}
#include<stdio.h>
const int num=5;
void func()
{
printf("fun in a.c");
}