数组与指针看起来很像

int a[] = {1, 2 ,3};

int *p = a;

如此,我们可以p[0], p[1], p[2]

看起来,与直接使用数组名没什么两样,但是看这段代码

sizeof(a)

sizeof(p)

你就会知道,原来数组里还隐含了大小信息,这是指针所不能做到的

严格的说,数组是一种内置的数据类型,C++标准对这种数据类型限定的某些行为使他看起来像

指针

1array are passed by reference by default

  这句话是说,我们可以将数组名赋给指针,将数组名放进函数参数中,则数组会退化成指针,再用sizeof得不到尺寸信息

void func(int a[]);

  很多人以为这个函数只接受数组为参数,结果在函数内部sizeof(a)发现,它就是一指针int*,坑人

2array are not assignable

   这里最关键的是数组名不能作为左值,不管是用int a[3]声明的数组还是int a[] = new int[3];得到的数组

在基本数据类型里,引用也具有这种"从一而终"的特性

3如何真正的传递数组(避免它退化成指针)

  看下面的函数原型

  void func(int(&a)[100]);

这个函数只接受大小为100的整型数组,有没有发现,我们按引用类型来传参数,就能避免数组退化成指针

  当然这么写没什么用,毕竟一个只能传递定长数组的函数也只能看看而已

利用c++模板编程的手法,可以这样子:

template<size_t N>

void func(int(&a)[N]);

这样就能接受任意大小的数组了,而且只接受数组

C++中的数组与指针的更多相关文章

  1. 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明

    [VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...

  2. C语言中的数组和指针以及字符串

    数组名同时也是该数组首元素的地址,而指针提供了一种用来使用地址的符号方法,因此指针能够很有效地处理数组. 将一个整数加给指针,这个整数会和指针所指类型的字节数相乘,然后所得的结果会加到初始地址上 da ...

  3. C语言中的数组与指针

    1. 数组的初始化 数组的初始化方法有很多,常用的方法有 定义时初始化 ]={,,}; 或 ]={}; //未初始化的元素全为0: 定义后遍历赋值初始化 int arr[3]; for(int i=0 ...

  4. C中的数组与指针问题

    反复在数组名与指针上犯错误,特记录下. ,,,,}; int *p, *q; p = (); q = (); *(p+1)?   *(q-1) ? 答案是 3, 5.这里主要涉及的问题就是指针参与运算 ...

  5. C++ 中 字符数组 和 指针 区别

    char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; c ...

  6. C++中的数组和指针

    #include <iostream> #include <set> using namespace std; int main() { ] = {,,,,,}; ]; p = ...

  7. PHP学习记录数组中的数组的指针

    unshift在数组头增加一个元素,push在数组尾增加一个元素,shift删除数组的第一个元素,pop删除数组的最后一个元素: <?php $item=array('苹果'); //在数组最前 ...

  8. C/C++中二维数组和指针关系分析

    在C/c++中,数组和指针有着密切的关系,有很多地方说数组就是指针式错误的一种说法.这两者是不同的数据结构.其实,在C/c++中没有所谓的二维数组,书面表达就是数组的数组.我猜想是为了表述方便才叫它二 ...

  9. 深入理解C语言中的指针与数组之指针篇

    转载于http://blog.csdn.net/hinyunsin/article/details/6662851     前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本 ...

随机推荐

  1. [bootstrap] 基本css样式和组件

    一.基本css样式 01.全局设置 全局 font-size 是 14px,line-height 是 20px. 这些样式应用到了 <body> 和所有的段落上. 另外,对 <p& ...

  2. HTML5自学笔记[ 23 ]canvas绘图基础7

    变换矩阵: transform(a,b,c,d,e,f),多次使用该函数,效果是多次状态改变的累加: setTransform(a,b,c,d,e,f),会忽略之前的变换,从起始状态开始改变.

  3. python中的md5加密

    import md5 import types def get_md5(data): if type(data) is not types.StringType: # 检验输入的数据是否为字符串 pr ...

  4. hdu 4315 Climbing the Hill(阶梯博弈转nim博弈)

    Climbing the Hill Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. uva---(11549)CALCULATOR CONUNDRUM

    Problem C CALCULATOR CONUNDRUM Alice got a hold of an old calculator that can display n digits. She ...

  6. iisreset和w3wp的关系

    iisreset是iis自带一个命令行工具.用法: iisreset [computername] /RESTART          停止然后重新启动所有 Internet 服务. /START   ...

  7. 51nod 1050 循环数组最大子段和

    题目链接:51nod 1050 循环数组最大子段和 #include<stdio.h> #include<algorithm> using namespace std; ; l ...

  8. Android开发--环境配置

    1.下载android adt和sdk adt: 新建链接http://dl.google.com/android/ADT-xx.x.x.zip下载adt 注:xx为需要下载adt的版本号,可以在官网 ...

  9. gawk

    gawk '$2>365&&$3>1' part-00000 | wc -l

  10. Windows server2003 + sql server2005 集群配置安装

    http://blog.itpub.net/29500582/viewspace-1249319/