17.静态内存分配
#include <stdio.h>
#include <stdlib.h>
void func(int** address)
{
int i = 100;
// 把 i 对应的地址赋值给iPoint变量
*address = &i;
}
main()
{
int* iPoint;
func(&iPoint); // 传iPoint变量的地址
printf("*iPoint的值为%d\n",*iPoint);
printf("*iPoint的值为%d\n",*iPoint);
printf("*iPoint的值为%d\n",*iPoint);
printf("pause");
}
output:
*iPoint的值为100
*iPoint的值为0
*iPoint的值为0
pause
18. 动态内存分配
#include <stdio.h>
#include <stdlib.h>
void func(int** address)
{
int i = 100;
int* temp = malloc(sizeof(int)); // 返回的是申请的内存地址
*temp = i; // 把值赋给申请的内存地址
*address = temp;
free(temp); // 释放申请的内存
}
main()
{
int* iPoint; // int类型的指针
func(&iPoint); // iPoint的地址传过去
printf("iPoint的值为%d\n",*iPoint);
printf("iPoint的值为%d\n",*iPoint);
printf("iPoint的值为%d\n",*iPoint);
}
19. 动态创建数组
#include <stdio.h>
#include <stdlib.h>
main()
{
int length;
printf("请输入你要创建数组的长度:");
scanf("%d",&length);
printf("你输入数组的长度为%d\n",length);
// 根据长度分配内存空间
int* iArray = malloc(length * sizeof(int));
int i;
for(i = 0; i < length; i++) {
printf("请输入iArray[%d]的值",i);
scanf("%d",iArray + i);
}
// 接收用户输入拓展数组长度
int suppLength;
printf("请输入你要拓展的数组的长度:");
scanf("%d",&suppLength);
printf("拓展数组的长度为:%d\n",suppLength);
// 根据拓展的长度重新分配内存空间
iArray = realloc(iArray,(length + suppLength) * sizeof(int));
for(i = length; i < length + suppLength; i ++) {
printf("请输入iArray[%d]的值",i);
scanf("%d",iArray + i);
}
// 输出数组的值
for(i = 0; i < length + suppLength; i++) {
printf("iArray[%d]的值为%d\n",i,*(iArray + i));
}
}
20-函数指针
#include <stdio.h>
#include <stdlib.h>
// 函数指针
// 定义一个函数
int add(int x,int y)
{
return (x + y);
}
main()
{
// 定义函数指针
int (*android)(int x,int y);
// 函数指针赋值
android = add;
// 使用函数指针
int result = android(99,1);
printf("result=%d\n",result);
}
21. 联合体
#include <stdio.h>
#include <stdlib.h>
// 定义一个联合体,特点,所有的字段都是使用同一块内存空间
union Mix{
long i; // 4个字节
int k; // 4个字节
char ii; // 1个字节
};
main()
{
printf("Mix:%d\n",sizeof(union Mix));
union Mix m;
m.i = 100;
m.k = 123;
printf("m.i=%d\n",m.i);
printf("m.k=%d\n",m.k);
}
output:
Mix:4
m.i=123
m.k=123
22. 枚举
#include <stdio.h>
#include <stdlib.h>
// 枚举的值是递增的
// 默认首元素的值是0
enum WeekDay {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
};
main()
{
enum WeekDay day = Sunday;
printf("%d\n",day);
}
output:
6
23. typedef别名
配合各种原有数据类型来达到简化编程的目的的类型定义关键字。
#include <stdio.h>
#include <stdlib.h>
typedef int i;
typedef long l;
typedef float f;
main()
{
i m = 10;
l n = 123123123;
f s = 3.1415926;
printf("m=%d\n",m);
printf("n=%ld\n",n);
printf("s=%f\n",s);
}
output:
m=10
n=123123123
s=3.141593
24.1 结构体
#include <stdio.h>
#include <stdlib.h>
// 定义一个结构体
struct student
{
int age;
float score;
char sex;
};
main()
{
// 使用结构体
struct student stu = {18,98.9,'w'};
// 结构体取值
printf("stu.age=%d\n",stu.age);
printf("stu.score=%.1f\n",stu.score);
printf("stu.sex=%c\n",stu.sex);
// 结构体赋值
stu.age = 20;
stu.score = 100;
stu.sex = 'm';
printf("stu.age=%d\n",stu.age);
printf("stu.score=%.1f\n",stu.score);
printf("stu.sex=%c\n",stu.sex);
printf("struct student的长度为%d\n",sizeof(struct student));
}
output:
stu.age=18
stu.score=98.9
stu.sex=w
stu.age=20
stu.score=100.0
stu.sex=m
struct student的长度为12
24.2. 结构体指针
#include <stdio.h>
#include <stdlib.h>
struct Student {
int age;
float score;
char sex;
};
main()
{
// 使用结构体
struct Student stu = {18,98.9,'W'};
// 结构体指针
struct Student* point = &stu;
struct Student** point2 = &point;
// 取值运算 (*point).age 等价于 point->age
printf("(*point).age==%d\n",(*point).age);
printf("(*point).score==%.1f\n",point->score);
printf("(*point).sex==%c\n",point->sex);
// 赋值运算
point->age = 20;
point->score = 100;
point->sex = 'M';
printf("point->age==%d\n",(*point).age);
printf("point->score==%.1f\n",point->score);
printf("point->sex==%c\n",point->sex);
// 二级结构体指针取值
printf("(**point2).age == %d\n",(**point2).age);
printf("*point2->age == %d\n",(*point2)->age);
}
output:
(*point).age==18
(*point).score==98.9
(*point).sex==W
point->age==20
point->score==100.0
point->sex==M
(**point2).age == 20
*point2->age == 20