1.全局变量
不在必要时不使用全局变量:全局变量在程序整个执行过程中都占用储存空间;使函数的通用性降低;降低程序的可读性。
全局变量均存放在静态储存区。
2.堆和栈
3.malloc函数
eg:静态数组和动态数组
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[10] = { 1,2,3,4,5,6,7 }; // 静态数组,大小为10,包含部分初始化的元素
int* p = (int*)malloc(sizeof(int) * 10);
// 动态分配内存空间,大小为10个整数(40字节)
p[1] = 12; // 修改动态分配的内存空间中的第二个元素为12
printf("%d\n", p[1]); // 输出动态分配的内存空间中的第二个元素的值,应该输出12
free(p); // 释放动态分配的内存空间
return 0; // 程序结束
}
eg:建立动态数组,输入5个学生的成绩,另外用一个函数检查其中有无低于60分的,输出不合格的成绩。
#include <stdio.h>
#include <stdlib.h>
int main()
{
void check(int*);
int* p1, i;
p1 = (int*)malloc(5 * sizeof(int));
for (i = 0; i < 5; i++)
scanf("%d", p1 + i);
check(p1);
return 0;
}
主函数中,声明了一个名为check的函数(返回类型为void,接受一个int型指针作为参数)。接着声明了一个整型指针p1和一个整型变量i。使用malloc函数动态地分配了一个能够存储5个整数的内存空间,并将其地址赋给p1指针。接下来通过for循环,使用scanf函数从用户输入获取5个整数,并依次存储到p1所指向的内存空间中。最后调用check函数,并传入p1指针作为实参。最后返回0,表示程序正常结束。
void check(int* p)
{
int i;
printf("They are fail:");
for (i = 0; i < 5; i++)
if (p[i] < 60)
printf("%d", p[i]);
printf("\n");
}
这部分是定义了一个名为check的函数。该函数接受一个int型指针p作为参数,返回类型为void,即不返回任何值。在函数体内,声明了一个整型变量i。接下来使用循环遍历p指针所指向的内存空间的内容
报错:表达式必须含有常量值
注意:在C语言中,结构体数组的长度必须是一个常量值,不能使用变量作为数组长度。
如:第一行是一个N,代表有N个评委。然后第二行有N个数,每个数用空格隔开,代表每个评委的打分。
4.动态数组基本操作
1.问题![](https://img-blog.csdnimg.cn/8cab5d672c9a43488596970adb84d33b.png)
2.思路/初始化
(1)记录首地址 (2)可储存数据总量与已储存数据总量的大小关系
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int* p1; // 记录动态数组首地址
unsigned int x; // 记录容量
unsigned int y; // 已储存数量
} dongshuzu;
void chushihua(dongshuzu* pshuzu) // 初始化赋值
{
pshuzu->x = 5;
pshuzu->p1 = (int*)malloc(sizeof(int) * pshuzu->x);
pshuzu->y = 0;
}
int main()
{
dongshuzu shuzu;
chushihua(&shuzu);
free(shuzu.p1);
return 0;
}