C++基础学习二

C++基础学习二

数组

int main()
{
    //数据类型 数组名[数组长度]
    int arr[5];int i;
    arr[0]=10; arr[1]=20; arr[2]=30; arr[3]=40; arr[4]=50;
    cout<<arr[0]<<' '<<arr[1]<<' '<<arr[2]<<' '<<arr[3]<<' '<<arr[4]<<endl;
    //数据类型 数组名[数组长度]={值1,值2....}
    int arr1[5]={10,20,30,40,50};
    for(int i=0;i<5;i++) {
        cout << arr1[i] << endl;  //如果初始化数据未全部赋值,会用0填补
    }
//    数据类型 数组名[]={值1,值2,值3.....}
     int arr2[]={60,70,80,90,100};
    for(int i=0;i<5;i++) {
        cout << arr2[i] <<' ';  //如果初始化数据未全部赋值,会用0填补
    }
    return 0;
}

统计数组在内存中所占空间

cout<<"arr2所占内存为:"<<sizeof(arr2)<<endl;
/*
arr2所占内存为:20
*/

查看数组首地址

cout<<"arr2数组的首地址为:"<<arr<<endl;
cout<<"arr2数组第一个元素的地址为:"<<&arr[0]<<endl;
cout<<"arr2数组第二个元素的地址为:"<<&arr[1]<<endl;
/*
arr2数组的首地址为:0x61fe00
arr2数组第一个元素的地址为:0x61fe00
arr2数组第二个元素的地址为:0x61fe04
*/

数组中找最大值

int main()
{
    int arr[5]={300,500,180,400,250};
    int max=arr[0];
    for(int i=1;i<5;i++)
    {
        if(arr[i]>max)
        {
            max=arr[i];
        }
    }
    cout<<"最大数为"<<max<<endl;
    return 0;
}
/*
最大数为500
*/

数组逆序

#include <iostream>
using namespace std;
int main()
{
    int arr[5]={1,2,3,4,5};
    int length=sizeof(arr)/sizeof(arr[0]),t;
    for(int i=0;i<length;i++)
        cout<<arr[i]<<' ';
    cout<<endl;
    for(int i=0;i<length/2;i++)
    {
        t=arr[i];
        arr[i]=arr[length-i-1];
        arr[length-i-1]=t;
    }
    for(int i=0;i<length;i++)
        cout<<arr[i]<<' ';
    cout<<endl;
    return 0;
}
/*
1 2 3 4 5
5 4 3 2 1
*/

冒泡排序

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

img

int main()
{
    int arr[]={3,6,1,0,5,9,7};
    int length=sizeof(arr)/sizeof(arr[0]),t;
    for(int i=0;i<length;i++)
        cout<<arr[i]<<' ';
    cout<<endl;
    for(int i=0;i<length-1;i++){
        for(int j=0;j<length-1-i;j++)
        {
            if(arr[j]>arr[j+1]) {
                t = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = t;
            }
        }}
    cout<<"----排序后----"<<endl;
    for(int i=0;i<length;i++)
        cout<<arr[i]<<' ';
    cout<<endl;
}
/*
3 6 1 0 5 9 7
----排序后----
0 1 3 5 6 7 9
*/

二维数组

#include <iostream>
using namespace std;
int main()
{
    // 数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } };
    int arr[2][3]={
            {1,2,3},
            {4,5,6}
    };
    cout<<"------1------"<<endl;
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<3;j++)
        {
            cout<<arr[i][j]<<' ';
        }
        cout<<endl;
    }
    cout<<"------2------"<<endl;
    // 数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};
    int arr1[2][3]={7,8,9,10,11,12};
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<3;j++)
        {
            cout<<arr1[i][j]<<' ';
        }
        cout<<endl;
    }
    cout<<"------3------"<<endl;
    //数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};
    int arr2[][3]={1,2,3,7,8,9,10,11,12};
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            cout<<arr2[i][j]<<' ';
        }
        cout<<endl;
    }
    return 0;
}
/*
------1------
1 2 3
4 5 6
------2------
7 8 9
10 11 12
------3------
1 2 3
7 8 9
10 11 12
*/

二维数组名

  • 查看二维数组所占内存空间
  • 获取二维数组首地址

统计每一行数字之和

int main()
{
    int score[3][3]={
            {100,100,100},
            {90,50,100},
            {80,90,85}
    };
    int sum[3]={0,0,0};
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            sum[i]+=score[i][j];
        }
    }
    for(int i=0;i<3;i++)
        cout<<sum[i]<<' ';
    cout<<endl;
    return 0;
}
/*
300 240 255
*/

函数

概述

作用:将一段经常使用的代码封装起来,减少重复代码

一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。

函数的定义

函数的定义一般主要有5个步骤:

1、返回值类型

2、函数名

3、参数表列

4、函数体语句

5、return 表达式

返回值类型 函数名 (参数列表)
{
       函数体语句
       return 表达式
}
int add(int num1,int num2)
{
    return num1+num2;
}
int main()
{
    int a=3,b=4,sum;
    sum= add(a,b);
    cout<<sum<<endl;
    return 0;
}

值传递

  • 所谓值传递,就是函数调用时实参将数值传入给形参
  • 值传递时,如果形参发生改变,并不会影响实参
void swap(int num1, int num2)
{
	cout << "交换前:" << endl;
	cout << "num1 = " << num1 << endl;
	cout << "num2 = " << num2 << endl;
    // 10
    // 20
	int temp = num1;
	num1 = num2;
	num2 = temp;
	cout << "交换后:" << endl;
	cout << "num1 = " << num1 << endl;
	cout << "num2 = " << num2 << endl;
    // 20
    // 10
	//return ; 当函数声明void时候,不需要返回值,可以不写return
}

int main() {
	int a = 10;
	int b = 20;
	swap(a, b);
	cout << "main中的 a = " << a << endl;
	cout << "main中的 b = " << b << endl;
    // 10
    // 20
	system("pause");
	return 0;
}

总结: 值传递时,形参是修饰不了实参的

函数的常见样式

常见的函数样式有4种

  • 无参无返
  • 有参无返
  • 无参有返
  • 有参有返

函数的声明

作用: 告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。

  • 函数的声明可以多次,但是函数的定义只能有一次
//声明
int max(int a, int b);
//定义
int max(int a, int b)
{
	return a > b ? a : b;
}
int main()
{
    .....
	return 0;
}

函数的分文件编写

作用:让代码结构更加清晰

函数分文件编写一般有4个步骤

  1. 创建后缀名为.h的头文件
  2. 创建后缀名为.cpp的源文件
  3. 在头文件中写函数的声明
  4. 在源文件中写函数的定义

add.h

#ifndef DEMO01_ADD_H
#define DEMO01_ADD_H

#include "iostream"
using namespace std;

int add(int num1,int num2);
#endif //DEMO01_ADD_H

add.cpp

#include "add.h"
int add(int num1,int num2)
{
    return num1+num2;
}

main.cpp

#include <iostream>
#include "add.h"
using namespace std;
int main()
{
    int a=3,b=4,sum;
    sum= add(a,b);
    cout<<sum<<endl;
    return 0;
}

指针

基本概念

指针的作用: 可以通过指针间接访问内存

  • 内存编号是从0开始记录的,一般用十六进制数字表示
  • 可以利用指针变量保存地址

指针变量的定义和使用

指针变量定义语法: 数据类型 * 变量名;

int main()
{
    int a=10;
    int *p;
    p=&a;
    cout<<"&a="<<&a<<endl;
    cout<<"p="<<p<<endl;
    cout<<"a="<<a<<endl;
    cout<<"*p="<<*p<<endl;
    return 0;
}
/*
&a=0x61fe14
p=0x61fe14
a=10
*p=10
*/

指针变量和普通变量的区别

  • 普通变量存放的是数据,指针变量存放的是地址
  • 指针变量可以通过" * "操作符,操作指针变量指向的内存空间,这个过程称为解引用

总结1: 我们可以通过 & 符号 获取变量的地址

总结2:利用指针可以记录地址

总结3:对指针变量解引用,可以操作指针指向的内存

指针内存空间

cout<<"sizeof(int *)="<<sizeof(int *)<<endl;
cout<<"sizeof(float *)="<<sizeof(float *)<<endl;
cout<<"sizeof(double *)="<<sizeof(double *)<<endl;
cout<<"sizeof(char *)="<<sizeof(char *)<<endl;
/*
sizeof(int *)=8
sizeof(float *)=8
sizeof(double *)=8
sizeof(char *)=8
*/
  • 所有指针类型在32位操作系统下是4个字节
  • 所有指针类型在64位操作系统下是8个字节

空指针和野指针

空指针:指针变量指向内存中编号为0的空间

用途:初始化指针变量

注意:空指针指向的内存是不可以访问的

int main()
{
        //指针变量p指向内存地址编号为0的空间
        //用于指针初始化
        int * p = NULL;
        //访问空指针报错
        //内存编号0 ~255为系统占用内存,不允许用户访问
        cout << *p << endl;
        return 0;
}

野指针:指针变量指向非法的内存空间

int main() {
	//指针变量p指向内存地址编号为0x1100的空间
	int * p = (int *)0x1100;
	//访问野指针报错 
	cout << *p << endl;
	return 0;
}

总结:空指针和野指针都不是我们申请的空间,因此不要访问。

const修饰指针

const修饰指针有三种情况

  • const修饰指针 — 常量指针
  • const修饰常量 — 指针常量
  • const既修饰指针,又修饰常量
int main() {
	int a = 10;
	int b = 10;
	//const修饰的是指针,指针指向可以改,指针指向的值不可以更改
	const int * p1 = &a; 
	p1 = &b; //正确
	//*p1 = 100;  报错
	
	//const修饰的是常量,指针指向不可以改,指针指向的值可以更改
	int * const p2 = &a;
	//p2 = &b; //错误
	*p2 = 100; //正确

    //const既修饰指针又修饰常量
	const int * const p3 = &a;
	//p3 = &b; //错误
	//*p3 = 100; //错误

	return 0;
}

数组和指针

int main()
{
    int arr[6]={1,2,3,4,5,6};
    int *p=arr;
    cout<<"第一个元素为:"<<*p<<endl;
    cout<<"第二个元素为:"<<*++p<<endl;
    int *n=arr;
    for(int i=0;i<6;i++)
    {
        cout<<*n+i<<' ';
    }
    cout<<endl;
    return 0;
}
/*
第一个元素为:1
第二个元素为:2
1 2 3 4 5 6
*/

指针与函数

//值传递
void swap(int *a, int *b) {
    int t;
    t = *a;
    *a = *b;
    *b = t;
    cout << "a=" << *a << endl;
    cout << "b=" << *b << endl;
}
int main()
{
    int a=7;
    int b=3;
    swap(&a, &b);
    cout << "a=" << a << endl;
    cout << "b=" << b << endl;
}
/*
a=3
b=7
a=3
b=7
*/

指针与函数和数组

void sort_arr(int *p, int length)
{
    int i, j, t;
    int a=*p;
    for(i=0;i<length-1;i++)
    {
        for(j=0;j<length-1-i;j++)
        {
            if(p[j] > p[j+1])
            {
                t = p[j];
                p[j] = p[j+1];
                p[j+1] = t;
            }
        }
    }
}
int main()
{
    int arr[10] = {4, 3, 1, 0, 9, 8, 2, 7, 3, 10};
    int l = sizeof(arr)/sizeof(arr[0]);
    sort_arr(arr, l);
    for(int i=0; i<l-1; i++)
        cout<<arr[i]<<' ';
    cout<<endl;
    return 0;
}
/*
0 1 2 3 3 4 7 8 9
*/

结构体

结构体定义

struct 结构体名 {结构体类型}

#include <iostream>
#include <string>
using namespace std;
//创建学生数据类型
//自定义数据类型,一些类型集合组成的一个类型
struct Student
{
    string name;
    int age;
    int score;
} s3;
//定义类型方式
//struct Student s1;
//struct Student s2={.....}
//struct Student {.....}s3;
int main()
{
    //struct关键字可以省略
    Student s1;
    //struct Student s1;
    s1.name = "大明";
    s1.age = 18;
    s1.score = 90;
    cout<<"姓名:"<<s1.name<<" 年龄:"<<s1.age<<" 分数:"<<s1.score<< endl;
    s3.name = "小丽";
    s3.age = 20;
    s3.score = 88;
    cout<<"姓名:"<<s3.name<<" 年龄:"<<s3.age<<" 分数:"<<s3.score<< endl;
    return 0;
}
/*
姓名:大明 年龄:18 分数:90
姓名:小丽 年龄:20 分数:88
*/

结构体数组

作用:将自定义的结构体放入到数组中方便维护

struct People
{
    string name;
    int age;
    float weight;
};
int main()
{
    People people_demo[3]=
            {
            {"张三", 18, 57},
            {"小丽", 19, 48.2},
            {"小花", 17, 45.6}
            };
    people_demo[2].name="张三";
    people_demo[0].age = 19;
    for(int i=0; i<3; i++)
    {
        cout<<"name:"<<people_demo[i].name<<" age:"<<people_demo[i].age<<" weight:"<<people_demo[i].weight<<endl;
    }
    return 0;
};
/*
name:张三 age:19 weight:57
name:小丽 age:19 weight:48.2
name:张三 age:17 weight:45.6
*/

结构体指针

struct People
{
    string name;
    int age;
    float weight;
};
int main()
{
    People s = {"张三", 18, 58.3};
    People *p=&s;
    cout<<"name:"<<p->name<<endl;
    cout<<"age:"<<p->age<<endl;
    cout<<"weight:"<<p->weight<<endl;
    return 0;
}
/*
name:张三
age:18
weight:58.3
*/

结构体嵌套结构体

struct Student
{
    string name;
    int age;
    float score;
};
struct Teacher
{
    string name;
    int age;
    struct Student stu;
};
int main()
{
    Teacher t;
    t.name = "王老师";
    t.age = 56;
    t.stu.name = "小王";
    t.stu.age = 18;
    t.stu.score = 90.5;
    cout<<"Teacher name:"<<t.name<<" Teacher age:"<<
    t.age<<" stu name:"<<t.stu.name<<" stu age:"
    <<t.stu.age<<" stu score:"<<t.stu.score<<endl;
    return 0;
}
/*
Teacher name:王老师 Teacher age:56 stu name:小王 stu age:18 stu score:90.5
*/

结构体做函数参数

struct Student
{
    string name;
    int age;
    float score;
};
void printfstu1(Student stu)
{
    stu.age = 20;
    cout<<"------子函数1-------"<<endl;
    cout<<"name:"<<stu.name<<" age:"<<stu.age<<" score:"<<stu.score<<endl;
}
void printfstu2(Student *p)
{
    p->age = 30;
    cout<<"------子函数2-------"<<endl;
    cout<<"name:"<<p->name<<" age:"<<p->age<<" score:"<<p->score<<endl;
}
int main()
{
    Student stu;
    stu.name = "张三";
    stu.age = 18;
    stu.score = 90.5;
    printfstu1(stu);
    cout<<"------主函数1后-------"<<endl;
    cout<<"name:"<<stu.name<<" age:"<<stu.age<<" score:"<<stu.score<<endl;
    printfstu2(&stu);
    cout<<"------主函数2后-------"<<endl;
    cout<<"name:"<<stu.name<<" age:"<<stu.age<<" score:"<<stu.score<<endl;
    return 0;
}
/*
------子函数1-------
name:张三 age:20 score:90.5
------主函数1后-------
name:张三 age:18 score:90.5
------子函数2-------
name:张三 age:30 score:90.5
------主函数2后-------
name:张三 age:30 score:90.5
*/

结构体案例1

#include <iostream>
#include <string>
using namespace std;
struct Student
{
    string name;
    int score;
};
struct Teacher
{
    string name;
    Student Array[5];
};
void allowStuTea(Teacher array[], int length)
{
    string nameSeed="ABCDEFGHIKLMNOP";
    int score[3][5]={{56, 93, 86, 76, 40},
                     {66, 80, 33, 77, 90},
                     {96, 88, 47, 60, 70}};
    for(int i=0;i<length;i++)
    {
        array[i].name="teacher_";
        array[i].name += nameSeed[i];
        for(int j=0;j<5;j++)
        {
            array[i].Array[j].name = "student_";
            array[i].Array[j].name += nameSeed[i*5+j];
            array[i].Array[j].score = score[i][j];
        }
    }
}
void Infomsg(Teacher array[], int length)
{
    for(int i=0;i<length;i++)
    {
        cout<<"老师姓名:"<<array[i].name<<endl;
        for(int j=0;j<5;j++)
        {
            cout<<"学生姓名:"<<array[i].Array[j].name<<" 成绩:"<<array[i].Array[j].score<<endl;
        }
        cout<<"--------------"<<endl;
    }
}
int main()
{
    Teacher tArray[3];
    int len=sizeof(tArray)/sizeof(tArray[0]);
    allowStuTea(tArray, len);
    Infomsg(tArray, len);
}
/*
老师姓名:teacher_A
学生姓名:student_A 成绩:56
学生姓名:student_B 成绩:93
学生姓名:student_C 成绩:86
学生姓名:student_D 成绩:76
学生姓名:student_E 成绩:40
--------------
老师姓名:teacher_B
学生姓名:student_F 成绩:66
学生姓名:student_G 成绩:80
学生姓名:student_H 成绩:33
学生姓名:student_I 成绩:77
学生姓名:student_K 成绩:90
--------------
老师姓名:teacher_C
学生姓名:student_L 成绩:96
学生姓名:student_M 成绩:88
学生姓名:student_N 成绩:47
学生姓名:student_O 成绩:60
学生姓名:student_P 成绩:70
--------------
*/

结构体案例2

#include <iostream>
#include <string>
using namespace std;

struct Hero
{
    string name;
    int age;
    string sex;
};
void Infomsg(Hero arr[], int len);
void sortHero(Hero arr[], int len);
int main()
{
    Hero heroArr[5]={{"刘备", 30, "男"},
                     {"关羽", 32, "男"},
                     {"张飞", 31, "男"},
                     {"赵云", 28, "男"},
                     {"貂蝉", 24, "女"}};
    int length=sizeof (heroArr)/sizeof (heroArr[0]);
    Infomsg(heroArr, length);
    sortHero(heroArr, length);
    Infomsg(heroArr, length);
}
void Infomsg(Hero arr[], int len)
{
    cout<<"------------"<<endl;
    for (int i=0;i<len;i++)
    {
        cout<<"name:"<<arr[i].name<<" age:"<<arr[i].age<<" sex:"<<arr[i].sex<<endl;
    }
}
void sortHero(Hero arr[], int len)
{
    Hero temp;
    for (int i=0;i<len-1;i++)
    {
        for(int j=0;j<len-1-i;j++)
        {
            if(arr[j].age>arr[j+1].age)
            {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
}
/*
------------
name:刘备 age:30 sex:男
name:关羽 age:32 sex:男
name:张飞 age:31 sex:男
name:赵云 age:28 sex:男
name:貂蝉 age:24 sex:女
------------
name:貂蝉 age:24 sex:女
name:赵云 age:28 sex:男
name:刘备 age:30 sex:男
name:张飞 age:31 sex:男
name:关羽 age:32 sex:男
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值