目录
数组中数据的初始化
数组中元素的访问
函数参数的传递
关键字:typedefdefine
typedef 类型定义
#define 宏定义
typedef 和 #define的区别
static 静态修饰
static修饰局部变量
static修饰全局变量
static修饰函数
数组:一组相同类型数据的集合。
例如: int arr[n];其中n必须是常量,但有一种情况例外——宏定义,如下所示。
#define MY_NUM 10
int arr[MY_NUM];
int arr[10]={1,2,3,4,5,6,7,8,9,10};数组中的元素用花括号括起来,以逗号间隔每个数据,花括号外以分号结束。
int arr[1000]={1};数组中的第0个元素是1,其余元素均以0填充。
int arr[100]={0};将数组中的元素全部初始化为0。
数组中的元素是通过下标来访问,数组的遍历只能通过循环逐个访问,不能整体访问。
#include
#include
#define MY_NUM 10
int main()
{
int arr[MY_NUM];
int i = 0;
for (i = 0; i < 10; i++)
{
arr[i] = i + 1;
printf("数组的第%d个元素是%d\n", i, arr[i]);
}
system("pause");
return 0;
}
注意:数组的元素访问是从0下标开始的,10个元素的下标依次为0-9。如果访问了arr[10],则为越界访问,访问到了不属于arr数组的空间会导致程序运行崩溃。
#include
#include
//int arr[]说明要传递进来的是个数组
void init_arr(int arr[], int sz)//该函数用于对数组的元素进行初始化
{
int i = 0;
for (i = 0; i < 10; i++)
{
arr[i] = i + 1;
}
}
int main()
{
int arr[10];
int i;
init_arr(arr,sizeof(arr)/sizeof(arr[0]));//调用函数
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
printf("数组的第%d个元素是%d\n", i, arr[i]);
}
system("pause");
return 0;
}
sizeof(arr)求数组所占的空间大小,sizeof(arr[0])求数组首元素所占的空间大小。
sizeof(arr)/sizeof(arr[0])即数组的元素个数。
typedef unsigned int uint 使用unsigned int定义了一个新的类型 uint
uint a; 等价于 unsigned int a;
作用:进行替换。宏定义后面不能有分号,否则分号也是宏定义的一部分。
#include
#include
#define MAX(a,b) (a>b)?(a):(b)
int main()
{
int ret = MAX(10, 20);
printf("%d\n",ret);
system("pause");
return 0;
}
“宏函数”针对一些魔幻数字,使用宏赋予数字一些含义,提高代码的可读性,宏函数并不是真正的函数,因此没有函数的调用消耗。
#define只是一种替换,而 typedef是定义一个类型。
#define INT int*
INT a,b; 等价于 int* a;int b;
typedef int* PINT
PINT a,b; 等价于 int* a;int*b;
改变了局部变量的生命周期,使局部变量的生命周期随程序的结束被释放。
#include
#include
int return_num()
{
int n = 10;
n += 10;
return n;
}
int main()
{
int i;
for (i = 0; i < 5; i++)
{
int ret=return_num();//每次调用函数后a重新赋值为10
printf("%d\n",ret);
}
system("pause");
return 0;
}
运行结果:20 20 20 20 20
#include
#include
int return_num()
{
//用static修饰局部变量后,局部变量的作用域为整个程序,因此不会在下一次调用时被释放
static int n = 10;
n += 10;
return n;
}
int main()
{
int i;
for (i = 0; i < 5; i++)
{
int ret=return_num();
printf("%d\n",ret);
}
system("pause");
return 0;
}
运行结果:20 30 40 50 60
改变了生命周期后,变量只会被初始化一次(只需要开辟一次空间), 随着作用域的结束空间不会被释放。
修改变量的访问属性(作用域)。
让这个全局变量仅在自己的作用域内生效,并且根据就近原则,所属文件内访问重名的时候优先访问自己文件内的。
因此:如果想要一个变量仅在所属.c文件内被使用,尽量使用static修饰;
如果要在整个工程内使用这个变量,就不要使用static修饰。
作用与修饰全局变量差不多(修改函数的访问属性,避免与外部其它函数命名冲突)
只要是同一个作用域,就不能使用同名的变量或者函数,无论是否使用static修饰。