数组、指针和引用的区别

目录

 

前言

1. 数组和指针

1.1 一维数组

1.2 二维数组

1.3 数组和指针的共同点和区别

2.指针和引用

3.感想


前言

这三个基础的概念,虽然每本书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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值