C++中的数组和指针

首先要明确一点,数组类型和指针类型确实是不同的类型!

char *p; //类型是char*

char str[6];//类型是char [6]

可用如下语句输出类型信息(需要#include<typeinfo>)

std::cout << typeid(p).name() << std::endl;
std::cout << typeid(str).name() << std::endl;

但是有时候我们总会定义这样的函数:

void foo(char *p){

cout << p << endl;

cout << sizeof(p) / sizeof(char); // 输出为4

}

我们发现把str丢进去它也正常运行了。于是想当然的,我就定义了这样一个函数:

void foo(char str[6]){

cout << str << endl;

cout << sizeof(str) / sizeof(char) << endl;// 输出也是4

}

我们发现输入p也没问题,这就有问题了,而且第二个输出让人费解,按照类型信息它应该输出6。

这里涉及的问题,就是,当你以非引用类型作为形参的时候,数组类型会被自动降为指针类型来处理,也就是foo(char str[6])跟 foo(char *p)是完全一样的!

为了演示这个知识点,我们将函数原型改成下面这样:

void foo(char (&str)[6]){

cout << str << endl;

cout << sizeof(str) / sizeof(char) << endl;// 输出为6

}

这时候,我们发现只有输入char[6]类型,才能通过编译,而且第二个输出为6,也就是数组长度信息在传参过程中正常保留了。

当以引用类型为形参的时候,数组类型不会降为指针类型!

最后,基于这一点,我们可以写出以任意维数组为参数的函数了,当然要用到模板,因为不同长度的数组属于不同的类型:

template<int N, int M>
int foo(int const (&a)[N][M], int const (&b)[N][M]){
std::cout << typeid(a).name() << std::endl; //输出 int[N][M]
return 0;
}

时间: 2024-10-07 02:22:49

C++中的数组和指针的相关文章

C语言中的sizeof中的数组和指针

1.引子 今日在看动态规划的0-1背包问题,看完后还是打算自己写着试试,毕竟实践才能出真知嘛.动态规划的结果是个二维数组dp,我copy书上的例子进行初始 memset(dp,0,sizeof(dp)),考虑到程序的健壮性,对于数组我都是用的动态申请,自然二维数组也不例外[动态二维数组的建立可参见本blog的延伸]. 程序写完后,但是却不能运行,开始单步调试,当进行到dp的赋值时老是报指针的错误!!!开始我以为是指针越界什么的,仔细才发现dp的数组维数确实要多申请一个用来存放初始情况的值(全是0

浅谈C中的数组和指针(二)

原文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 在原文基础上增加自己的理解作为修改 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组的一些区别,然而在某些情况下,指针和数组是等同的,下面讨论一下什么时候指针和数组是相同的. C语言标准对此作了说明: 规则1:表达式中的数组名被编译器当做一个指向该数组第一个元素的指针: 注:下面几种情况例外 1)数组名作为sizeof的操作数 2)使用&

C语言中的数组与指针

1. 数组的初始化 数组的初始化方法有很多,常用的方法有 定义时初始化 int arr[3]={1,2,3}; 或 int arr[3]={2}; //未初始化的元素全为0: 定义后遍历赋值初始化 int arr[3]; for(int i=0;i<3;i++) arr[i]=i; C99之后,出现了另一种十分方便的初始化方式.即利用元素位置来初始化该元素,使用方法如下 int arr[5]={[3]=1,3} 初始化后的结果 arr[5]={0,0,0,1,3} 此种方式的缺点是,后面的初始化

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

unshift在数组头增加一个元素,push在数组尾增加一个元素,shift删除数组的第一个元素,pop删除数组的最后一个元素: <?php $item=array('苹果'); //在数组最前添加一个元素 array_unshift($item,'香蕉'); print_r($item); //在数组最后添加一个数组 array_push($item,'菠萝'); print_r($item); //删除第一个元素 array_shift($item); print_r($item); //删

数组和指针关系的探讨

在学习过程中,数组和指针的操作几乎完全一样,且不说传数组可以用传指针完全替代,而且指针也可以使用[]操作符来访问指针偏移后的地址,所以在实际应用中数组和指针用不出任何差别.(如下代码所示) #include<iostream> using namespace std; int main() { int a[]={1,2}; cout<<*a<<endl; int* b=a; cout<<*b<<endl; return 0; } 所以人们在实际使

C语言中数组与指针

数组是内存空间的一片连续的区域,用于存贮一组相同数据类型元素的集合. 指针变量中存放的是变量的地址,通过指针取得地址,再通过地址提取数据. 在大多是C语言书中,都有这样的说法,“数组和指针是相同的”.其实,数组与指针,只能在特定的情况下才是相同的,在大多书情况下,他们并不相同. C语言中每个表示变量的符号都代表一个地址,而每个变量的值就是该地址里所存储的内容. 定义一个字符数组 char a[]="asdfghjkl";现在来访问第i个字符a[i],编译器符号表中具有一个符号,它代表的

直观理解C语言中指向一位数组与二维数组的指针

一维数组和指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我

【示例】C语言中利用数组存放函数指针

C语言中利用数组存放函数指针,增加函数使用的灵活性.使用时只需提供数组索引,即可调用不同函数. 预备知识: 1.指向函数的指针 一个函数在编译时被分配一个入口地址,这个地址就被称为函数的指针. 例如: int max(int,int); // 声明函数,比较两数大小 int (*p)(); //声明指向函数的指针变量 p=max; //将函数max的入口地址赋给指针变量p int c=(*p)(a,b); //调用函数 2.函数指针作为函数参数 该例子中每次给process函数不同实参(函数名)

数组与指针的区别,以及在STL中传递数组/指针

数组和指针在作为实参传入T[] 或T*的形参时没有区别 void f(int pi[]) { cout << sizeof(pi) << endl; } int a[5] = { 1,2,3,4,5 }; f(a); 上述代码输出的是4(32位系统)或8(64位系统),总之不是sizeof(int) * 5(数组大小). 为什么明明形参是数组形式的int [],实际上和指针形式的int *无异呢?关键原因就在于,数组是不能作为左值的. 也就是说,你不能定义两个数组,比如int a[