局部变量:作用域
生命期开始:自定义之处起生效
生命期结束:所在大括号结束
int main()
{
if(1)
{
int b=123; // b生效 (定义之处开始)
} // b已经失效
// 不可以访问一个已经失效的变量 ❌
printf("%d \n", b);
return 0;
}
int test()
{
int a = 111; // a生效
if(1)
{
printf("a: %d \n", a);
}
return 0;
} //a失效
名称的覆盖: 本层的变量名覆盖上一层的变量名
int test2()
{
int a = 1;
{
int a = 2; // 每一层大括号,都是一个新的上下文
printf("%d \n", a);
}
printf("%d \n", a);
return 0;
} //a失效
全局变量:永不失效的变量
定义在函数之外的变量,称为全局变量。
全局变量永不失效,每个函数都可以访问。
int number = 1;
void test()
{
number = 2;
}
int main()
{
printf("number: %d \n",number);
number ++;
printf("number: %d \n",number);
test();
printf("number: %d \n",number);
return 0;
}
如何选择:局部变量与全局变量
-
只要能用局部变量解决的问题,就不用全局变量。
-
当你发现局变量解决不了一个问题的时候,考虑用全局变量
C语言的麻烦之处
C语言不允许函数重名,所以不能实现函数重载,这给程序员带来了不小的麻烦
可以使用C++实现函数重载
返回指针的函数
指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型
的
返回指针类型
的函数,比如下面这个函数,返回一个指向char类型变量的指针
// 将字符串str中的小写字母变成大写字母,并返回改变后的字符串
// 注意的是:这里的参数要传字符串变量,不能传字符串常量
char * upper(char *str) {
// 先保留最初的地址。因为等会str指向的位置会变来变去的。
char *dest = str;
// 如果还不是空字符
while (*str != '\0') {
// 如果是小写字母
if (*str >= 'a' && *str <= 'z') {
// 变为大写字母。小写和大写字母的ASCII值有个固定的差值
*str -= 'a' - 'A';
}
// 遍历下一个字符
str++;
}
// 返回字符串
return dest;
}
int main()
{
// 定义一个字符串变量
char str[] = "jia";
// 调用函数
char *dest = upper(str);
printf("%s", dest); // JIA
return 0;
}
指向函数的指针
1.为什么指针可以指向一个函数?
函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址
,那就好办了,我们的指针变量就是用来存储地址
的。因此,可以利用一个指针指向一个函数。
其中,函数名就代表着函数的地址。
2.指向函数的指针的定义
int sum(int a, int b) {
return a + b;
}
int main()
{
// 定义一个指针变量p,指向sum函数
int (*p)(int a, int b) = sum;
// 或者 int (*p)(int, int) = sum;
// 或者 int (*p)() = sum;
// 利用指针变量p调用函数
int result = (*p)(1, 3);
// 或者 int result = p(1, 3);
printf("%d", result); // 4
return 0;
}
指向函数的指针变量主要有两个用途:
-
调用函数
-
将函数作为参数在函数间传递
int sum(int a, int b) {
return a + b;
}
int minus(int a, int b) {
return a - b;
}
void counting( int (*p)(int, int) , int a, int b) {
int result = p(a, b);
printf("计算结果为:%d\n", result);
}
int main()
{
// 进行加法运算
counting(sum, 6, 4);
// 进行减法运算
counting(minus, 6, 4);
return 0;
}
如果以后想再增加一种乘法运算,非常简单,根本不用修改counting函数的代码,只需要再增加一个乘法运算的函数
int mul(int a, int b) {
return a * b;
}
然后counting(mul, 6, 4);就可以进行乘法运算了
网友评论