C++学习----Day1

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在指针和结构体中的使用场景

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; 指针常量 指向不能修改 指向的值可以修改 因此 引用本质上就是指针常量,但所有的指针操作编译器为我们完成了

你可能感兴趣的:(c++,学习)