项目
1.程序入口函数
main.cpp为了让阅读者知道我这里面写的是入口函数
2.将不同的功能模块用不同的.h .cpp 来封装
.h 头文件 函数声明(不能实现)
.cpp .c 实现文件 函数的具体实现
3.导入头文件进行使用
头文件里声明函数
4.实现文件
<1. >导入需要实现的头文件
<2. >实现头文件里的所有方法
计算器项目demo
1.main.cpp
#include<stdio.h>
/*
1.程序入口函数
main.cpp为了让阅读者知道我这里面写的是入口函数
2.将不同的功能模块用不同的.h .cpp 来封装
.h 头文件 函数声明(不能实现)
.cpp .c 实现文件 函数的具体实现
3.导入头文件进行使用
*/
#include"Calculator.h"
int main(){
int result = add(1,1);
printf("1 + 1 = %d\n",result);
printf("1 + 1 = %d\n",add(1,1));
printf("2 - 1 = %d\n",minus(2,1));
printf("2 * 2 = %d\n",multiply(2,2));
printf("2 / 2 = %d\n",devide(2,2));
return 0;
}
2.Calculator.cpp
/*实现文件
1. 导入需要实现的头文件
2. 实现头文件里的所有方法
3.
*/
/*
1.预编译(展开全部头文件)
*/
#include"Calculator.h"
//加法
int add(int a,int b){
return a + b;
}
//减法
int minus(int a,int b){
return a - b;
}
//乘法
int multiply(int a,int b){
return a * b;
}
//除法
int devide(int a,int b){
if(b == 0){
return 0;
}else{
return a / b;
}
}
3.Calculator.h
#include<stdio.h>
//头文件里声明函数
//加法
int add(int a,int b);
//减法
int minus(int a,int b);
//乘法
int multiply(int a,int b);
//除法
int devide(int a,int b);
程序运行结果:
结构体
1.普通变量,常量,静态变量,当程序结束了 这些变量就没了
2.自动申请的内存,当重启电脑之后也没了,但密码一直存在 程序结束还是电脑重启
3.当永久保存数据时
<1.>内存: 8G 16G 为正在运行的程序分配内存
<2.>硬盘: 永久保存 -> 文件
<3.> 创建文件
4.结构体使用
int float 只能存单个数据
int num[] 可以存多个数据 必须同种类型
当遇到 【学生:学号long long 年龄 Int 姓名 char *】数据类型时
<1.>什么时候使用结构体:
需要一种类型,这种类型可以保存多种数据
<2.>结构体是什么:
int char
一种类型
<3.>如何定义结构体类型
注意定义结构体类型时,内部类型不能赋初值
struct student{
int age;
char sex;
char name[10];
}
类的成员变量不能赋初值,对象可以赋初值
<4.>如何使用结构体
int a = 10;
struct student xw;
struct student lw = {40,'m',"老王"};
//使用结构体变量
lw.age = 35;
注意:结构体类型内存自己数计算
对齐类型 小类型 -> 大类型对齐
指针
1.指针(几级指针间的访问)
<1.>什么是指针
指针是一个变量,这个变量只能存地址
指针变量占据 8个字节空间
<2.>指针作用
在函数之间传递数据(>1)给调用者
2.指针的定义: int *pa;
<1.> 定义的时候表明是一个指针变量
<2.>使用的时候 表示取地址的值
& :取地址
3.指针形式
int a = 10;//普通变量
int *pa ;//指针变量(占据内存8个字节)
int *a1[10] ;//整形指针数组
a1[3] :[[1,2,3],[4,5,6],[7,8,9]]
char *a2[10];//字符指针数组
a2[3] :["look","at","you"]
int test(int a);//函数
int (*test)(int a); //函数指针
int temp = 10;//直接访问temp=20 间接访问->指针变量*p=20
int *p = &temp;//定义指针变量
*p = 20;//取地址的值
4.指针的类型
去掉*号和变量名 就是指针的类型
int *p ;整型指针
char p ;字符指针
int (func)p; 函数指针
指针变量只能指向同种数据类型的地址
5.指针的值
就是指向的内存空间的首地址
6.指针指向的值(区域)
7.指针的运算
8.指针和数组
9.指针和函数
指针demo
#include<stdio.h>
/*指针
(几级指针间的访问)
1.什么是指针 作用
如果希望在函数之间传递数据(>1)给调用者
什么是指针:指针是一个变量,这个变量只能存地址
指针变量占据 8个字节空间
* :1. 定义的时候表明是一个指针变量
2. 使用的时候 表示取地址的值
& :取地址
int a = 10;//普通变量
int *pa ;//指针变量(占据内存8个字节)
int *a1[10] ;//整形指针数组
a1[3] :[[1,2,3],[4,5,6],[7,8,9]]
char *a2[10];//字符指针数组
a2[3] :["look","at","you"]
int test(int a);//函数
int (*test)(int a); //函数指针
int temp = 10;//直接访问temp=20 间接访问->指针变量*p=20
int *p = &temp;//定义指针变量
*p = 20;//取地址的值
2.指针的类型
去掉*号和变量名 就是指针的类型
int *p ;整型指针
char *p ;字符指针
int (*func)p; 函数指针
指针变量只能指向同种数据类型的地址
3.指针的值
就是指向的内存空间的首地址
4.指针指向的值(区域)
5.指针的运算
6.指针和数组
7.指针和函数
*/
/*声明一个变量 没有分配内存空间
int tt;
tt-> ox100;
tt = 20;
*/
/*定义一个变量 立刻分配内存空间 并且赋值
int tt2 = 20;
*/
int test(int a){
return a + 1;
}
//一个turn只能返回一个值
int test2(int a,int s){
a + 1;
s + 1;
return a + 1;
}
int main(){
int *pa;
char *pb;
printf("%d\n",sizeof(pa)); //求整形指针*pa所占字节
printf("%d\n",sizeof(pb)); //求字符指针*pb所占字节
return 0;
}
程序运行结果;
指针定义具体
#include<stdio.h>
/*
常用指针常量
int *a;
常量指针
指针常量
指向常量的常量指针
*/
int main(){
int a;
int b;
//常量指针
int const *pa = &a;
//*pa = 50;//错误 不能改变指针指向的变量的值
pa = &b;//正确 可以改变指针的指向
//指针常量
int * const pb = &a;
*pb = 50;//正确 可以改变指针指向的变量的值
//pb = &b;//错误 不能改变指针的指向
//指向常量的常量指针
int const * const pc = &a;
//*pc = 50;//错误 不能改变指针指向的变量的值
//pc = &b;//错误 不能改变指针的指向
int *ptemp = &a;
//ptemp=20;错误 指针变量只能存地址
//1.数组名num就是数组的首地址
//数组名本身没有分配内存
//sizeof(num)计算整个数组的内存空间
//数组是一片连续的内存空间
//指针只是一个变量(存地址)
//共同点
//数组也可以用指针的方式去访问
//num[0]=20;
//*num=20;
//num[1]=30;
return 0;
}
动态分配内存
1.常量区分配内存
常量字符串的内存空间游戏系统自动分配
在常量区里面分配 当程序结束才会被释放
常量区 - 常量 const int a = 1
2.静态区分配内存
静态区 static(从程序开始到程序结束)
3.栈和堆
<1.>栈
局部变量 int a = 19;
离开作用域就自动收回(从定义到离开代码块)
<2.>堆
自己申请的内存 malloc calloc realloc
必须自己释放(从申请到自己释放)
5.为什么需要动态分配内存:
<1.>
需要存储的数据需要延长生命周期
<2.>
一个指针变量需要存储数据 ,变量本身只能存地址,不能存数据,需要分配内存空间来存储数据
6.怎么动态分配内存空间:
如果使用指针变量接受数据,必须先为这个指针变量分配一片指向的内存空间,有内存空间才能存数据
<1.>导入头文件<stdlib.h>
<2.>使用malloc (memory alloc)申请内存空间
#include<stdio.h>
#include<stdlib.h>
/*动态分配内存
为什么需要动态分配内存:
1.需要存储的数据需要延长生命周期
2.一个指针变量需要存储数据 ,变量本身只能存地址
不能存数据,需要分配内存空间来存储数据
怎么动态分配内存空间:
1.
*/
int main(){
//char name[100] = {};
char *name;
//如果使用指针变量接受数据
//必须先为这个指针变量分配一片指向的内存空间
//有内存空间才能存数据
//导入头文件<stdlib.h>
//使用malloc (memory alloc)申请内存空间
name = (char*)malloc(10*sizeof(char));//分配10个内存空间
if(name == NULL){//判断申请内存空间是否成功
//申请内存失败
exit(EXIT_FAILURE);
}
scanf("%s",name);
printf("%s\n",name);
//使用realloc动态改变已经分配内存的大小
//增加或减少
name = (char*)realloc(name,20*sizeof(char));//内存为20个字节
if(name == NULL){//判断申请内增加c存空间是否成功
//分配内存失败,退出之前必须将之前分配的内存释放掉
free(name) ;
exit(EXIT_FAILURE);
}
//使用完毕必须自己手动释放内存
free(name);
return 0;
}
程序运行结果:
动态分配内存demo
1.
#include<stdio.h>
//常量字符串的内存空间游戏系统自动分配
//在常量区里面分配 当程序结束才会被释放
//常量区 - 常量 const int a = 1
//静态区 static(从程序开始到程序结束)
/*栈 局部变量 int a = 19;
离开作用域就自动收回(从定义到离开代码块)*/
/*堆 自己申请的内存 malloc calloc realloc
必须自己释放(从申请到自己释放) */
char *test(){
char *name = "jack";
return name;
}
char *test1(){
char name[10] = {'j','a','c','k'};//数组是一个局部变量
return name;
}
//int count = 0;//全局变量(当前文件)
void test3(){
//静态变量 只会被定义一次
//生命周期 从开始到结束
static int count = 0;
count++;
printf("count:%d\n",count);
}
int main(){
char *p;
p = test1();
printf("-%s\n",p);
return 0;
}
程序运行结果:
2.
#include<stdio.h>
#include<stdlib.h>
/*动态分配内存空间demo
请输入姓名:jack(默认没有空格)
是否继续(y/n)?:y
请输入姓名:jackson(默认没有空格)
是否继续(y/n)?:n
录入两个人的信息
jack
jackson
要求:不浪费内存(即动态分配内存空间)
*/
/*存一个字符串
int a = 10;
int *p;
char = 'c';
char *p;
char name[10] = {'a',};
char *p;
char *name = {'jack','marry'};
char* *p;
*/
void inputName(char**p,int num){//定义指针变量 记录人数变量
//1.创建空间容纳即将输入的人
char*temp = (char*)malloc(sizeof(char*));
if(temp == NULL){
exit(EXIT_FAILURE);
}
char *name;
printf("请输入名字:");
int i = 0;
while(1){
char c = getchar();
if(c == '\0'){
break;
}
//判断是不是第一个字符
//分配内存空间
if(i == 0){
name = (char*)malloc(1*sizeof(char));
if(name == NULL){
exit(EXIT_FAILURE);
}
//保存这个字符
name[0] = c;
} else{
//在之前的基础上再多加分配一个内存空间
name = (char*)realloc(name,(i+1)*sizeof(char));
if(name == NULL){
exit(EXIT_FAILURE);
}
name[i] = c;
}
i++;
}
//将name的值传递给temp
temp = name;
printf("%s\n",temp);
}
int main(){
//定义一个指针变量,指向存储人名的内存空间
char**names;//char*(字符串) *p(指针)
//定义变量记录人数
int total = 0;
//开始输入人名
while(1){
//输入人的名称
inputName(names,total);
}
return 0;
}