c++基础(二)

字符串

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

//可以简写成:
char greeting2[] = "Hello";

遍历字符串 : 字符串实际上背后还是一个数组,所以可以使用数组遍历的手法来获取每一个字符 。

char  name[] = "hello";

for (int i = 0; i < sizeof(name ) / sizeof(char); ++i) {
   std::cout << name[i] << std::endl;
}

字符串操作

 //拷贝字符串
char  name[] = "hello";
char name2[6];

//参数一: 目标字符串, 参数二:源字符串
strcpy(name2 , name);
std::cout << name2 << std::endl;

//拼接字符串
strcat(name2 , " , 张三");
std::cout << name2 << std::endl;

// 返回字符串长度
int len = strlen(name2);
std::cout << "name2的长度:" << len << std::endl;

Vector

Vector其实很大程度上和数组一样,只是数组是固定长度,而vector是不定长度(动态增长)。 假设我们需要记录明年的测试成绩,但是我们并不知道明年会有多少个学生。那么可以有两种选择,定义一个固定长度的数组,这个长度超过假设的长度, 另一种办法就是使用动态数组,比如是: vector

vector 在C++STL(标准模板库)中的一个容器,可以看成是对容器的一种扩展。在运行时可以改变长度 , 与数组具有相似的语法 , 相比数组更高效 , 提供越界检查

  • 声明
#include <vecotr>
using namespace std;

int main(){
    
    vector <char> vowels; 
    vector <int> test_score;

    // =========================
    vector <char> vowels(5);  //声明一个初始大小为5的char类型vector
    vector <int> test_score(10);
   	return 0;
}
  • 初始化
#include <vecotr>
using namespace std;

int mian(){
    //数组定义
    int test_score []{100,99,18,81}

    //vector定义
    vector <char> vowels {'a' , 'e' , 'i' , 'o' ,'u'}; 
    vector <int> test_score{ 100 ,98,95,90,80};
    vector <double> temperatures{26,20.7};
    
    return 0;
}
  • 操作vector
vector<int> test_score {100,90,85};
test_score.at(0) = 73;  // 修改

//追加
test_score.push_back(80); // 100 , 90 , 85 , 80
test_score.push_back(95); // 100 , 90 , 85 , 80 , 95

//使用下标遍历
vector<int> scores{ 100 ,95 ,88 ,80 ,75};
for (int i = 0; i < scores.size(); ++i) {
  cout << scores[i] << endl;
}

//基于范围for遍历
vector<int> scores{ 100 ,95 ,88 ,80 ,75};
for(int score : scores){
  cout << score << endl;
}
  • 越界检查
// 只要当我们使用了vector的语法去获取超出索引的元素时,就会抛出异常。而使用数组的语法去获取元素,则不会进行越界检查
  • 二维vector : 二维vector和二维数组实际上差不太多,二维数组是数组里面装的是数组,二维vector指的是vector里面装的还是vector,在未来碰到矩阵相关的存储操作,多半使用vector来作为媒介。
//例:

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

int main(){

    //声明并初始化vector
    vector<vector<int>> scores {
            {95,77,80,85},
            {58,89,93,100},
            {69,73,81,97}
    };

    for (int i = 0; i < scores.size(); ++i) {
        for (int j = 0; j < scores[i].size(); ++j) {
           cout << scores[i][j] <<"\t" ;
        }
        cout << endl;
    }
	return 0 ;
}
  • Vector总结
// vector是一个动态增长的数组, 随着我们添加内容,会逐步的增加空间。实际上它并不是在原来的地方,追加空间。而是开辟新的空间,然后把数据拷贝都新的空间里面去,接着让容器指向这块新的空间。

函数

函数的四种写法

/*
无参无返回值
无参有返回值
有参无返回值
有参有返回值
*/


// int a 和 int b 为参数
// return 后面为返回值
int add(int a , int b){
		return a + b;
	}
	

函数的定义

  • 先定义后使用
#include <iostream>
using namespace std;

//函数定义 ,函数的真正实现。
int add(int a , int b){
    return a + b ; 
}

int main(){
    cout << add(1 ,2)<< endl;
    return 0 ;
}
  • 先申明后使用 :把函数分成声明和定义两部分,函数的原型定义在调用的前面,具体实现可以放在后面。
#include <iostream>
using namespace std;

//函数声明 ,也叫函数原型 并不知道这个函数具体是如何实现的。只是有一些基本架子而已。
int add (int a , int b);

int main(){
    cout << add(1 ,2)<< endl;
    return 0 ;
}

//函数定义 ,函数的真正实现。
int add(int a , int b){
    return a + b ; 
}
  • 分离式编译
1. 头文件(.h文件)里面主要是用于声明(变量 、函数、类)
2. 函数或者类的具体实现,就应该放在源文件(cpp文件)当中
3. 头文件里面的三句话不能省略,可以防止重复包含头文件
4. 只需要在源文件中include就OK 。
  • 函数是如何被调用工作的
1. 函数是使用函数调用栈来管理函数调用工作的。
   1. 类似盒子的栈
   2. 遵循后进先出
   3. 可以往里面执行压栈和出栈动作(push 和 pop)
2. 栈的结构和激活记录
   1. 函数必须把它的返回值返回给调用它的函数(A ---> B)
   2. 每次函数的调用都需要创建一次激活记录,然后把它压入栈中(push)
   3. 当一个函数被调用完毕的时候,就需要从栈中弹出(pop)
   4. 函数的参数以及内部的局部变量都是存储在栈中。
3. 函数栈有可能抛出栈溢出异常(Stack Overflow)
   1. 一旦函数调用栈中被push进来的函数记录过多,就有可能出现。(例如:无限循环调用 | 递归 )
  • 范围规则
// 单独代码块
#include<iostream>
using namespace std;

int main(){
    
    int  num{10};
    int  num1{20};
    
    cout << num << num1 << endl;
    
    {
        int num{100};
        cout << "num = "<< num << endl;
        cout << "num1 = "<< num1 << endl;
    }
    
}
// 函数中局部变量
#include<iostream>
using namespace std;

int num{300};
void local_example(int x){
    
    
    int num{1000};
    cout << "num =" << num << endl;
    
    num = x ;
    cout << "num =" << num << endl;
 
    
}
/*静态本地变量

1. 只会初始化一次
2. 重复调用函数也只会初始化一次。*/

#include<iostream>
using namespace std;

void static_local_example(){
    
    static int num{100};
    cout << "num ="<< num << endl;
    num+=100;
    cout << "num ="<< num << endl;
}

int main(){
    static_local_example();
    static_local_example();
    return 0 ;
}
/*全局变量 :
通常声明在所有函数和类的外部 ,若存在局部变量和全局变量同名情况下,可以使用 域操作符 `::` 来访问全局变量*/

#include<iostream>
using namespace std;

int age = 99;
int main(){
    
    int age =18 ;
    cout << ::age << endl;
    return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值