指针访问全局变量和直接使用全局变量的区别和优缺点
时间: 2024-05-29 09:13:53 浏览: 107
指针访问全局变量和直接使用全局变量的区别在于,指针需要先定义并初始化,并且需要通过指针变量来访问全局变量;而直接使用全局变量则可以直接访问,不需要定义指针。
优点方面,使用指针访问全局变量可以有效的管理内存,避免内存泄漏;而直接使用全局变量则可以提高代码的可读性和编写的效率。缺点方面,使用指针访问全局变量需要更多的代码量,适用于需要频繁访问全局变量的情况;而直接使用全局变量则需要更多的内存,不适用于资源受限的情况。
总的来说,指针访问全局变量和直接使用全局变量各有优劣,需要根据实际情况进行选择。
相关问题
编写一个函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其他字符的个数,在主函数中输入字符串以及输出上述的结果。 ①在程序中用全局变量。编译和运行程序,分析结果。讨论为什么要用全局变量。 ②能否不用全局变量,修改程序并运行之。
好的,我来回答你的问题。
下面是使用全局变量的程序:
```c
#include <stdio.h>
#include <ctype.h>
int letter_count = 0, digit_count = 0, space_count = 0, other_count = 0;
void count(char str[])
{
int i = 0;
while (str[i] != '\0')
{
if (isalpha(str[i]))
letter_count++;
else if (isdigit(str[i]))
digit_count++;
else if (isspace(str[i]))
space_count++;
else
other_count++;
i++;
}
}
int main()
{
char str[100];
printf("请输入一个字符串:");
fgets(str, sizeof(str), stdin);
count(str);
printf("字母个数:%d\n", letter_count);
printf("数字个数:%d\n", digit_count);
printf("空格个数:%d\n", space_count);
printf("其他字符个数:%d\n", other_count);
return 0;
}
```
这个程序会统计输入的字符串中字母、数字、空格和其他字符的个数,并使用全局变量来存储这些计数器的值。全局变量的优点是在函数之间共享数据,可以减少参数传递的复杂性和开销。但是全局变量的缺点是容易被误用或者滥用,可能会导致代码的可读性和维护性下降。
如果不想使用全局变量,可以将计数器作为参数传递给函数,如下所示:
```c
#include <stdio.h>
#include <ctype.h>
void count(char str[], int *letter_count, int *digit_count, int *space_count, int *other_count)
{
int i = 0;
while (str[i] != '\0')
{
if (isalpha(str[i]))
(*letter_count)++;
else if (isdigit(str[i]))
(*digit_count)++;
else if (isspace(str[i]))
(*space_count)++;
else
(*other_count)++;
i++;
}
}
int main()
{
char str[100];
int letter_count = 0, digit_count = 0, space_count = 0, other_count = 0;
printf("请输入一个字符串:");
fgets(str, sizeof(str), stdin);
count(str, &letter_count, &digit_count, &space_count, &other_count);
printf("字母个数:%d\n", letter_count);
printf("数字个数:%d\n", digit_count);
printf("空格个数:%d\n", space_count);
printf("其他字符个数:%d\n", other_count);
return 0;
}
```
这个程序和前一个程序的功能是相同的,但是使用了参数传递来代替全局变量。函数 `count` 接收了指向计数器变量的指针,并在函数内部更新了这些变量的值。这种方法可以避免全局变量带来的问题,但是需要增加函数参数的数量,可能会增加代码的复杂性。
define和typedef优缺点
`define` 和 `typedef` 都是 C/C++ 中用于类型定义的预处理器指令,它们各有优点和缺点:
**define**:
- **优点**:
- 简单易用:只需提供常量名和值即可,适用于简单的宏替换。
- 全局可见:定义的宏在整个程序中有效。
- **缺点**:
- 缺乏类型检查:宏展开是在编译前完成的,如果在使用过程中类型不匹配可能导致错误不易察觉。
- 容易导致命名冲突:全局宏如果有同名定义,后面的会覆盖前面的。
**typedef**:
- **优点**:
- 类型别名:创建新的数据类型名称,提高代码可读性和一致性。
- 类型安全性:编译器可以在使用typedef之前检查类型转换是否合法。
- 更改类型:无需修改已有的变量声明,仅需更改typedef。
- **缺点**:
- 作用范围有限:typedef定义的类型别名只限于当前文件或函数内部,不像宏那样全局可见。
- 不能代替函数指针:typedef不能直接将函数类型转换为其他类型。
阅读全文