项目 结构体 动态分配内存

项目

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); 

程序运行结果:


36.PNG

结构体

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;
}

程序运行结果;


指针.PNG

指针定义具体

#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;
}

程序运行结果:


66.PNG

动态分配内存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;
}

程序运行结果:


动态分配内存.PNG

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;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,663评论 1 32
  • 几种语言的特性 汇编程序:将汇编语言源程序翻译成目标程序编译程序:将高级语言源程序翻译成目标程序解释程序:将高级语...
    囊萤映雪的萤阅读 3,064评论 1 5
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,615评论 3 44
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型...
    龍飝阅读 2,302评论 0 12
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,679评论 1 51

友情链接更多精彩内容