目录
前言
这三个基础的概念,虽然每本书C++编程语言的书都会提及,但是心里总觉得少了点什么,时时遇到BUG,总是百度了解决了,就这样过去了,这是个很不好的习惯。而且,博文代码从之后都进行验证。呵呵,光说不练假把式,指不定哪儿就跟自己想的有差别!
以后代码均在VS2013演示,因为还是小菜鸟一枚,所以有些东西不考虑那么多,所以这里我先不去纠结cout和printf,不去纠结UNICODE编码,不去纠结用#define还是常量或枚举的问题,先把基础学好,后面在慢慢探索,真是任重而道远!
1. 数组和指针
1.1 一维数组
先看下面例子:
// ConsoleTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
/*
函数功能:将传入的值都置为0
*/
void ClearAllValueForZero(int *pSrc, size_t length)
{
for (int i = 0; i < length; i++)
{
pSrc[i] = 0;
}
}
#define LENGTH 5
void main()
{
int arr[] = { 1, 2, 3, 4, 5 };
int *p = new(std::nothrow) int[LENGTH]{1, 2, 3, 4, 5};
if (p == nullptr)
{
return;
}
for (int i = 0; i < LENGTH; i++)
{
printf("%d", arr[i]);
}
printf("\n");
for (int i = 0; i < LENGTH; i++)
{
printf("%d", p[i]);
}
printf("\n");
ClearAllValueForZero(arr, LENGTH);
ClearAllValueForZero(p, LENGTH);
for (int i = 0; i < LENGTH; i++)
{
printf("%d", arr[i]);
}
printf("\n");
for (int i = 0; i < LENGTH; i++)
{
printf("%d", p[i]);
}
printf("\n");
delete[] p;
p = nullptr;
}
//输出结果
12345
12345
00000
00000
请按任意键继续. . .
上面代码,完成的功能是一模一样。因为这样,曾经让我觉得数组和指针差不多嘛,随便了解了解就OK了。
为什么上述代码实现的功能是相同的。数组名作为参数传递给函数时,实际上该函数名等效为指向该数组首元素的指针。
也就是
void ClearAllValueForZero(int *pSrc, size_t length)
等价于
void ClearAllValueForZero(int src[], size_t length)
1.2 二维数组
注意:一维数组可以这样理解,但是《C和指针》中提到,二维数组有区别,示例代码如下
// ConsoleTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
/*
* 将所传入的值置为0
*/
void ClearAllValueForZero(int **pSrc, int row, int col)
{
for (int ir = 0; ir < row; ir++)
for (int ic = 0; ic < col; ic++)
{
pSrc[ir][ic] = 0;
}
}
#define M 2
#define N 3
void main()
{
int arr2[M][N] = { 1, 2, 3, 4, 5, 6 };
ClearAllValueForZero(arr2, M, N); //错误
for (int i = 0; i < M; i++)
for (int j = 0; j < N; j++)
{
printf("&d", arr2[i][j]);
}
}
//错误提示
IntelliSense: "int (*)[3]" 类型的实参与 "int **" 类型的形参不兼容
错误 1 error C2664: “void ClearAllValueForZero(int **,int,int)”: 无法将参数 1 从“int [2][3]”转换为“int **”
从上述代码可以看出,这样连编译都通不过。为啥一维数组OK&#x