```
//void test(){
// int b = 7;
// static int a = 3;
// a++;
// b++;
// printf("a = %d , b = %d\n", a, b);
//}
typedef struct student {
int num;
char name[20];
}Student;
void *fun(){
char string[] = "adjid";
return string; //string 是局部变量 返回就错了 所以禁止这么返回
}
char fun1(){
return 'c';
}
int main(int argc, const char * argv[]) {
char *ret = fun();
char ret1 = fun1();
printf(" %c",ret1);
只读 coust
const int a = 0;
a = 3; //这时就错了
static 静态 将局部变量 不被释放
test();
test();
malloc()
作用 : 在内存中开辟一块空间
参数 : 开辟空间的大小(单位 :字节)
返回值: 开辟空间的首地址
int *p = malloc(4);
int *p = malloc(sizeof(int));
*p = 3;
printf("%d \n", *p);
int *p = malloc(sizeof(int) * 3);
*p = 10;
*(p + 1) = 11;
*(p + 2) = 12;
for (int i = 0; i < 3; i++) {
printf("%d ", *(p + i));
printf("%d ", p[i]);
}
从键盘输入字符串,将字符串中的数字挑出来存到另一个数组
char src[20] = {0};
char des[20] = {0};
int j = 0;
printf("输入:");
scanf("%s", src);
for (int i = 0; i < strlen(src); i++) {
if ( src[i] >= '0' && src[i] <= '9') {
des[j] = src[i];
j++;
}
}
printf("%s", des);
1.开辟一个空间,存一个double类型的值,并打印
double a = 2.432;
printf("%f \n", a);
2.开辟一个空间,存 8 个double类型的值,并打印每个元素
double *p = malloc(sizeof(double) * 8);
double val[8] = {12.12, 23.44, 43.6, 431.3, 674.34, 5.2, 34.34, 34.645};
p = val;
for (int i = 0; i < 8; i++) {
printf(" %f ",*p++);
}
3.开辟一个空间,存一个结构体(student)类型的值(为每个成员赋值),并打印
Student stu = {111,"aaa"};
printf(" %d %s", stu.num, stu.name);
4.开辟一个空间,存 3 个结构体(student)类型的值(为每个成员赋值),并打印
Student stu[3] = {{111,"aaa"},
{222,"bbb"},
{333,"ccc"}};
for (int i = 0; i < 3; i++) {
printf(" %d %s\n", stu[i].num, stu[i].name);
}
输入3个单词,动态分配内存保存单词,并在最后输出
char temp[20] = {0};
char *words[3] = {NULL};
for (int i = 0; i < 3; i++) {
scanf("%s", temp);
//计算输入的单词长度
long len = strlen(temp);
//开辟空间
words[i] = malloc(sizeof(char) * (len + 1));
//存储到开辟的空间中
strcpy(words[i], temp);
}
for (int i = 0; i < 3; i++) {
printf("%s\n", words[i]);
}
//释放空间
for (int i = 0;i < 3 ; i++) {
free(words[i]);
}
int a = 0; int *p = malloc(sizeof(int ));
1.可以通过名字和地址访问 只能通过地址访问
2.在编写代码是限定好大小 可以在执行时动态分配大小
3.生存周期结束后系统自动释放 只能手动释放
4.两次连续定义,地址连续 不一定连续
5.栈区 -开辟小空间 堆区- 大空间
int a = 0 ;
printf("栈 区:%p\n",&a);
int *p = malloc(sizeof(int));
printf("堆 区:%p\n",p);
static int b = 0;
printf("静态区:%p\n",&b);
char *s = "adads";
printf("常量区:%p\n", s);
printf("代码区:%p", fun);
/ 动态内存分配方式
// 目的:用一个正好的数组去存挑出的数字
char src[100] = {0};
int num = 0;
scanf("%s", src);
// 1, 先查出数字个数
for (int i = 0; i < strlen(src); i++) {
if (src[i] >= '0' && src[i] <= '9') {
num++;
}
}
// 2, 动态开辟一段空间, 并为\0多预留一个空间
char *p = malloc(sizeof(char) * (num + 1));
// 保存空间的首地址
char *head = p;
// 3, 存数字
for (int i = 0; i < strlen(src); i++) {
// 判断, 若为数字
if (src[i] >= '0' && src[i] <= '9') {
*p = src[i];
p++;
}
}
*p = '\0';
printf("%s\n", head);
周游老师 16:05:10
1, 开辟一个空间, 存一个double类型的值, 并打印
double *p = malloc(sizeof(double));
*p = 5.5;
printf("%.1f\n", *p);
2, 开辟一个空间, 存8个double类型的值, 并打印每一个元素
double *p = malloc(sizeof(double) * 8);
for (int i = 0; i < 8; i++) {
*(p + i) = 100.0 / (i + 1);
printf("%.1f ", p[i]);
}
3, 开辟一个空间, 存1个结构体(student)类型的值(为每一个成员赋值), 并打印
Student *p = malloc(sizeof(Student));
p->num = 1;
p->sex = 'm';
p->score = 99.9;
strcpy(p->name, "superMan");
printf("%d %s %c %.1f\n", p->num, p->name, p->sex, p->score);
4, 开辟一个空间, 存3个结构体(student)类型的值(为每一个成员赋值), 并打印
Student *p = malloc(sizeof(Student) * 3);
for (int i = 0; i < 3; i++) {
(p + i)->num = i;
(p + i)->sex = 'm';
(p + i)->score = 99.9 - i;
strcpy((p + i)->name, "superMan");
printf("%d %s %c %.1f\n", (p + i)->num, (p + i)->name, (p + i)->sex, (p + i)->score);
}
“`