最近想把自己的基础打牢固,故想从C复习先,然后C++,去实现一些数据结构和算法。
变量
变量是程序可操作的存储区的的名称,C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表
type var_list
int i=0; 带初始化的定义har c;
float num;
int j; //不带初始化的定义
//不带初始化的定义带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
变量的声明有两种情况:
- 需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
- 不需要建立存储空间的,通过使用extern关键字声明变量名而不定义它。 例如:extern int a 其中变量 a 可以在别的文件中定义的
extern int i; //声明,不是定义
int i; //声明,也是定义 extern后续再研究
常量
- 整数常量可以以U,L或者u,l结尾,代表unsigned或者long,浮点数也可以包括E,但是要符合规范
- 字符串字面值或常量是括在双引号 "" 中的。一个字符串包含类似于字符常量的字符:普通的字符、转义序列和通用的字符
- 定义常量的方式有两种:#define和const,#define一般放在main函数之前,const可放在函数内部
#include<stdio.h>
#define WIDTH 5;
int main()
{
const int LENGTH = 10;
return 0;
}
C储存类
C储存定义了程序的变量和函数作用的范围和生命周期,有四种类型:auto,register,static,extrn.
- auto储存类
我们在定义数据时,一般默认前面加auto,是所有默认变量的储存类
int count;
auto int count;
- register储存类
register数据类型定义的局部变量是储存在寄存器里而不是RAM,但是不一定一定储存在寄存器,还要看系统硬件因此它的最大大小不会大于寄存器的大小,寄存器只用于需要快速访问的变量,比如计数器。
register int count;
- static储存类
static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。
static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。
全局声明的一个 static 变量或方法可以被任何函数或方法调用,只要这些方法出现在跟 static 变量或方法同一个文件中。
#include <stdio.h>
/* 函数声明 */
void func1(void);
static int count=10; /* 全局变量 - static 是默认的 */
int main()
{
while (count--) {
func1();
}
return 0;
}
void func1(void)
{
\/** 'thingy' 是 'func1' 的局部变量 - 只初始化一次 每次调用函数 'func1' 'thingy' 值不会被重置。*/
static int thingy=5;
thingy++;
printf(" thingy 为 %d , count 为 %d\n", thingy, count);
}
result:
thingy 为 6 , count 为 9
thingy 为 7 , count 为 8
>thingy 为 8 , count 为 7
thingy 为 9 , count 为 6
>thingy 为 10 , count 为 5
thingy 为 11 , count 为 4
thingy 为 12 , count 为 3
thingy 为 13 , count 为 2
thingy 为 14 , count 为 1
thingy 为 15 , count 为 0
- extern 存储类
extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。
当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。
函数参数
如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。当调用函数时,有两种向函数传递参数的方法:
- 传值调用:该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。
- 引用调用:通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。
作用域规则
任何一种编程中,作用域是程序中定义的变量所存在的区域,超过该区域变量就不能被访问。C 语言中有三个地方可以声明变量:
- 在函数或块内部的局部变量
- 在所有函数外部的全局变量
- 在形式参数的函数参数定义**
- 局部变量
在某个函数或块的内部声明的变量称为局部变量。它们只能被该函数或该代码块内部的语句使用。局部变量在函数外部是不可知的。 - 全局变量
全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量。全局变量可以被任何函数访问。也就是说,全局变量在声明后整个程序中都是可用的。
在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,会使用局部变量值,全局变量不会被使用 - 形式参数
函数的参数,形式参数,被当作该函数内的局部变量,如果与全局变量同名它们会优先使用。下面是一个实例:
#include <stdio.h>
/* 全局变量声明 */
int a = 20;
int main ()
{
/* 在主函数中的局部变量声明 */
int a = 10;
int b = 20;
int c = 0;
int sum(int, int);
printf ("value of a in main() = %d\n", a);
c = sum( a, b);
printf ("value of c in main() = %d\n", c);
return 0;
}
/* 添加两个整数的函数 */
int sum(int a, int b)
{
printf ("value of a in sum() = %d\n", a);
printf ("value of b in sum() = %d\n", b);
return a + b;
}
result:
value of a in main() = 10
value of a in sum() = 10
value of b in sum() = 20
value of c in main() = 30
数组
- 传递数组参数给函数
void myFuncton(int *para){ ....} //传入的参数为一个指针
void myFunction(int para[]) //传入的参数为长度不确定的数组
void myFunction(int para[3]) //传入的参数为长度确定的数组
- 从函数返回数组
C 语言不允许返回一个完整的数组作为函数的参数。但是,可以通过指定不带索引的数组名来返回一个指向数组的指针.C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。
int *myFunction()
{
static int a[2] = {0} //
return a;
}
int main()
{
int *p ;
p = myFunction()
print("%d",*(p+0))
return 0;
}
网友评论