C++语法部分与C语言相同,本博客核心为面向对象以及C++与C语言不同方面的补充
野指针:随意指定一块内存地址,作为指针访问时会发生权限错误.
int *p = (int *) 0x0001;
在程序中要尽量避免使用野指针,这是一种错误的使用方式
正确的指针使用前要对该内存进行申请使用 例如 :
int a = 10;
就是向内存中申请了一块内存 并命名为a.
将函数的声明写在头文件中(.h)
函数定义写在源文件中(.cpp) 在源文件中通过 #include “.h” 将二者关联起来 共同构成一个函数模块 便于程序的维护
在main函数中 直接 #include “.h” 即可调用该函数 无需声明和重新定义
现以冒泡排序为例:
①在头文件中新建名为: bubble_sort.h 的头文件 并在该头文件中实现函数的声明
#include
using namespace std;
int bubble_sort(int *p, int size);
②在源文件中新建名为 bubble_sort.cpp 的源文件 并在该源文件中实现函数的定义
#include "bubble_sort.h" // 自定义头文件 用双引号
int bubble_sort(int *p, int size)
{
int i, j, temp;
for(i = 0; i < size-1; i++)
{
for(j = 0; j < size-1-i; j++)
{
if(p[j] > p[j+1])
{
temp = p[j];
p[j] = p[j+1];
p[j+1] = temp;
}
}
}
}
③在源文件中新建名为 main.cpp 的源文件
#include "bubble_sort.h"
int main()
{
int a[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
bubble_sort(a, 10);
int i;
for (i = 0; i < 10; i++)
{
cout << a[i] << endl;
}
system("pause");
return 0;
}
const 修饰指针共有三种情况
名称 | 用法 |
---|---|
常量指针 | 指针的指向可以修改,指向的值不可修改 |
指针常量 | 指针的指向不可修改,指向的值可以修改 |
不可修改指针 | 指针的指向和值均不可修改 |
常量指针:
int a = 10, b = 20;
const int *p = &a;
//******************************************************
p = &b; // 可以
*p = 40; // 不可以
指针常量:
int a = 10, b = 20;
int * const p = &a;
//******************************************************
*p = 20;// 可以
p = &b;// 不可以
不可修改指针:
int a = 10;
const int * const p = &a;
结构体中const使用场景
在函数形参中使用const struct student s 可以减少内存空间,不会复制新的副本出来,同时不会误操作修改s的值
内存区 | |
---|---|
代码区 | 写的全部代码 在计算机中为机器语言 保存在代码区 |
全局区 | 全局变量 静态变量(static) 常量(全局常量 字符串常量)存储在全局区 |
栈区 | main函数先入栈,执行其他函数时 该函数入栈 执行完毕即出栈,同时释放该函数所有内存,该函数内的局部变量失效 |
堆区 | 由程序员管理,使用new关键字,可以将数据开辟到堆区,new关键字返回值为一个地址,因此需要定义指针来接收,类似malloc方法 |
在堆区中开辟和删除内存:
在堆区中创建一个变量 int *p = new int(10) 10为变量值 释放则为:delete p
在堆区中创建一个数组 int *arry = new int[10]; 返回该数组的首地址给arry接收 释放:delete [] arry;
引用就是给变量起一个别名 原名与别名都指向同一块内存区
语法: 数据类型 &别名 = 原名;
int a = 10;
int & b = a;
// 此时b 的值为 10 修改b的值 a的值也会发生改
注意! 引用必须初始化,并且一旦初始化后就不可以修改了
引用的其他应用场景
①引用做函数参数:
int f(int &a)
{
//相当于地址传递
}
②引用做函数返回值
int &f()
{
return &a;
}
//这个函数调用可以进行赋值操作
f() = 1000;
③常量引用
修饰形参 防止误操作
int f(const &a)
④
int & ref = 10; 会报错 因为引用必须引一块合法的内存空间
const int & ref = 10;不报错 因为加上const后编译器优化代码修改为 int temp = 10; const int& ref = temp
引用的本质:
int &ref = a; 本质上 计算机自动转化为 int * const ref = &a; 指针常量 指向不能修改 指向的值可以修改 因此 引用本质上就是指针常量,但所有的指针操作编译器为我们完成了