前言
数组与指针为结构化编程中相当重要的内容,这两部分经常与引用和函数相互结合,但混起来一起讲的话可能篇幅较长容易晕。对于数组与指针这部分,主要面对的内容如下述:
数组
数组的定义形式:
定义:
类型 数组名[数组长度1]...[数组长度n];
类型:
一维数组,二维数组...n维数组,前面的n对应上面[ ]中的n,有几个维数就有几个[ ]。
一般来说不会定义到三维数组,因为真是太。。。。繁琐了,在图像处理等领域最常见的应该就是二维数组,分别表示横纵像素的位置。
应该在意的一些细节:
初始化
数组的赋值是从[0]下标开始的,而不是1。如果不注意这一点将造成地址错误,内存泄露的问题。
对于一维数组来说可以赋值少于数组所需个数的值。
比如: int a[3]={2,3};则a[0]=2,a[1]=3,a[2]=0;
此外一维数组可以省略包含多少个数量的值进行直接赋值,比如int a[]={4,5,7};则cout<<a[2]<<endl;输出的是7。
对于二维数组的话必须写明所需的列数,这个原理其实和一维数组一样。
不要在函数内部定义大数组
如【C++的探索路2】部分所讲述的内容,函数的内存空间为临时的位置,定义在栈这个位置上。在临时存储的位置定义大数组好比在临时停车场停了一辆重型坦克,很容易破坏栈。比如说在函数内部定义 int a[10000];一般来说编译器会直接蹦出一个stack crack之类的错误。
如果实在需要定义一个大数组,把它扔到所有函数之外,你的编译器会非常感谢你的所作所为。
数组做函数参数
主要就两点:
第一点:可以不写参数个数,二维数组需要写列数,这一点在上面的初始化部分进行了讲述。
第二点:数组作为函数参数是传引用
对于上述,可见下列程序:
void InsertionSort(int a[], int n) {
int i;
for (i = 0; i < n - 1; ++i) {
int tmp = a[i + 1];
int j = i;
while (j >= 0 && tmp < a[j]) {
a[j + 1] = a[j];
--j;
}
a[j + 1] = tmp;
}
}
void PrintArray(int a2d[][5], int n) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < 5; ++j)
cout << a2d[i][j] << " ";
cout << endl;
}
}
int main()
{
int b[5] = { 50,20,30,40,10 };
int a2d[3][5] = { {5,2,3,1,4},{10,20,50,40,30},{100,120,50,140,30} };
InsertionSort(b, 5);
for (int i = 0; i < 5; ++i)
cout << b[i] << " ";
cout << endl;
for (int i = 0; i < 3; ++i)
InsertionSort(a2d[i], 5);
PrintArray(a2d, 3);
return 0;
}
本段程序共运用了两个知识点,其一为插入排序,其二为数组传参的使用
对于插入排序,其原理为:从右往左,依次取有序部分的元素和待插入元素比较,如果大于,则将该元素右移。。。
对于数组传参的使用,我们在PrintArray函数的定义可以看到,对于二维数组的打印,我们需要指定它的列数,不然我们无法确定地址位置。如果形参写成int a2d[3][]则会出现报错。
本部分小结如下
指针
指针为C++语言中非常重要的部分,无论是结构化还是面向对象中都有非常重要的应用,该部分的主要结构陈列如下:
本小节将分五个部分进行陈述,依次为基本概念,作用与副作用,空指针与void指针,常量指针以及函数指针。
基本概念
指针与指针变量
书中定义部分存在部分的偏差,也有可能是表述存在省略,从而导致部分歧义&#x