C语言---Day5
13、作用域规则
---C 语言中有三个地方可以声明变量:在函数或块内部的局部变量; 在所有函数外部的全局变量; 在形式参数的函数参数定义中
---局部变量:在某个函数或块的内部声明的变量称为局部变量,它们只能被该函数或该代码块内部的语句使用,局部变量在函数外部是不可知的
int main () { /* 局部变量声明 */ int a, b; int c; /* 实际初始化 */ a = 10; b = 20; c = a + b; printf ("value of a = %d, b = %d and c = %d\n", a, b, c); // value of a = 10, b = 20 and c = 30 return 0; }
---全局变量:全局变量是定义在函数外部,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的,在任意的函数内部能访问全局变量,全局变量可以被任何函数访问
/* 全局变量声明 */ int g; int main () { /* 局部变量声明 */ int a, b; /* 实际初始化 */ a = 10; b = 20; g = a + b; printf ("value of a = %d, b = %d and g = %d\n", a, b, g); // value of a = 10, b = 20 and g = 30 return 0; }
---在程序中,局部变量和全局变量的名称可以相同,但是在函数内,如果两个名字相同,会使用局部变量值,全局变量不会被使用
/* 全局变量声明 */ int g = 20; int main () { /* 局部变量声明 */ int g = 10; printf ("value of g = %d\n", g); // value of g = 10 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; } /* 全局变量声明 */ 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); // value of a in main() = 10 c = sum( a, b); // value of a in sum() = 10 , value of b in sum() = 20 printf ("value of c in main() = %d\n", c); // value of c in main() = 30 return 0; }
---全局变量与局部变量在内存中的区别:
- 全局变量保存在内存的全局存储区中,占用静态的存储单元;
- 局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。
14、数组
---声明数组:需要指定元素的类型和元素的数量
double balance[10];
---初始化数组:可以逐个初始化数组,也可以使用一个初始化语句
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
---大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目,如果省略掉了数组的大小,数组的大小则为初始化时元素的个数
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
---赋值:为数组中某个元素赋值
balance[4] = 50.0; // 把数组中第五个元素的值赋为 50.0
---访问数组元素:通过数组名称加索引进行访问
double salary = balance[9];
eg 输出:Element[0] = 100 Element[1] = 101 ................................... Element[9] = 109
// 输出数组中的10个数 int main () { int n[ 10 ]; /* n 是一个包含 10 个整数的数组 */ int i,j; /* 初始化数组元素 */ for ( i = 0; i < 10; i++ ) { n[ i ] = i + 100; /* 设置元素 i 为 i + 100 */ } /* 输出数组中每个元素的值 */ for (j = 0; j < 10; j++ ) { printf("Element[%d] = %d\n", j, n[j] ); } return 0; }
---获取数组长度:使用 sizeof 运算符来获取数组的长度
int array[] = {1, 2, 3, 4, 5}; int length = sizeof(array) / sizeof(array[0]); printf("数组长度为: %d\n", length); // 数组长度为: 5
---宏定义
#define LENGTH(array) (sizeof(array) / sizeof(array[0])) int main() { int array[] = {1, 2, 3, 4, 5}; int length = LENGTH(array); printf("数组长度为: %d\n", length); // 数组长度为:5 return 0; }
---数组名:数组名表示数组的地址,即数组首元素的地址; 在声明和定义一个数组时,该数组名就代表着该数组的地址,使用&运算符来获取数组的地址
int myyArray[5] = { 10, 20, 30, 40, 50 }; int* ptr = &myyArray[0];
---数组名用于指针运算,在函数传递参数或遍历数组时运用
void printArray(int arr[], int length) { for (int i = 0; i < length; i++) { printf("%d ", arr[i]); // 数组名arr被当作指针使用 } } int main() { int myArray[5] = {10, 20, 30, 40, 50}; printArray(myArray, 5); // 将数组名传递给函数 return 0; }
// 求平均值 float avg(int arr[], int len) { float average = 0; for (int i = 0; i < len; i++) { average += arr[i]; } average = average / len; return average; } int main() { int arrL[10]; int arrLength = sizeof(arrL) / sizeof(arrL[0]); for (int i = 0; i < arrLength; i++) { printf("请输入第%d个数: ", i + 1); scanf_s("%d", &arrL[i]); } float ave = 0; ave = avg(arrL, arrLength); printf("输出的平均值为:%.1f\n", ave);