第一篇、程序设计基础及数据结构基础
一些基本概念:
1.c++内置类型:
分为基本类型和复合类型。基本类型包括整数、浮点数及两者的多种变体。复合类型包括数组、字符串、指针、引用、结构体和共用体等
2.内存分区
1)堆:由程序员手动分配和释放,完全不同于数据结构中的堆,分配方式类似链表。由malloc或者new来分配,free和delete来释放。若程序员不释放,程序结束时由系统释放
2)栈:由编译器自动分配和释放的,存放函数的参数值、局部变量的值等。操作方式类似数据结构中的栈
3)全局(静态)存储区:
4)文字常量区:
5)代码区
第一章、数组
1.int& a[10];//错误,没有引用数组,但是数组有引用
定义数组的引用:
int a[6] = {1, 2, 3, 4, 5, 6};
int (&p)[6] = a;
此时,p是数组a的引用。数组的引用可以用于函数实参传递。
2.数组的初始化:没有显式初始化的索引,会自动初始化
#include <iostream>
using namespace std;
int main()
{
int a[4] = {0};
int b[4];
cout << a[2] << " " << b[2] << endl;
return 0;
}
3.数组的动态声明和释放
int *a = new int[n];
delete []a;
4.c风格字符串和字符数组
c风格字符串末尾是'\0'
5.二维数组
//1
int a[3][4] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11}};
//2
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11};
int a[3][4] = {{1},{2}};
c++中,在声明和初始化一个二维数组时,如果对二维数组的所有元素都赋值,则第一维可以省略
6.二维数组的动态声明
int **a = new int*[m];
for(int i = o; i < m; i++)
a[i] = new int[n];
//释放
for(int i = 0; i < m; ++i)
delete []a[i];
delete []a;
7.指针数组与数组指针
int *a[10];//创建一个有十个整型指针的数组
数组指针,其实就是一个指向数组的指针
int (*p)[10];//定义了一个指向有十个元素整型数组的指针
二维数组的数组名是一个数组指针
int a[4][10];
int (*p)[10];
p = a;//a的类型是int(*)[10]
int a[10];
int (*p)[10] = &a;
int *q = a;
上面代码中,虽然p和q都是指向同一个元素,但是p和q的类型不同。
8.指针在高维数组中的应用
一些考题:
int main()
{
char a[] = {'a', 'b'};
char b[] = {'a', 'b', '\0'};
cout << strlen(a) << " " << strlen(b) << endl;
cout << sizeof(a) << " " << sizeof(b) << endl;
return 0;
}
strlen(a) 这个值是不确定的,strlen函数需要确保以null结束
注意逗号表达式
关于逗号表达式:
int main()
{
int a = 1, b = 2, c = 3;
int a1 = (a++, ++b, c--);
int a2;
a2 = a, b, c--;
cout << a1 << " " << a2 << endl;
return 0;
}
等等。