C++面试题5:建议在函数里面不要用sizeof算数组的大小

C++面试题5:建议在函数里面不要用sizeof算数组的大小

#include <iostream>using namespace::std;
void foo(const int[]);
int main()
{
    int arr[3] = {1,2,3};
    cout<<"in main array size: "<<sizeof(arr)/sizeof(int)<<endl;
    foo(arr);
}
void foo(const int arr[])
{
    cout<<"in foo array size: "<<sizeof(arr)/sizeof(int)<<endl;
}
Output:
in main array size: 3
in foo array size: 1

注意:在C++函数中,如果把一个数组作为参数传进去,那么这个数组会退化为一个指针,因而就不知道这个数组的长度了。

《imperfect C++》可以采用一个小技巧求出一个数组长度的函数, 用了个template把长度直接截取,因为传入的是一个数组的引用(注意数组引用作为参数的语法),所以能够在编译期把指针识别出来。

template <typename T, int N>
int arr_size(T (&arr)[N])
{
    return N;//函数直接返回作为参数传入的数组的长度。
}
时间: 2025-01-14 05:14:48

C++面试题5:建议在函数里面不要用sizeof算数组的大小的相关文章

c++面试题2:虚函数是如何实现的?

c++面试题2:虚函数是如何实现的? 1.虚函数如何实现的? 虚函数是通过一张虚函数表实现的,有多少个虚函数,就有多少个指针: 在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承.覆盖的问题: 实际上在编译的时候,编译器会自动加上虚表 虚函数的作用实现动态联编,也就是说在程序运行阶段动态的选择合适的成员函数,在定义了虚函数之后,可以在基类的派生类中对虚函数重新定义. 虚表的使用方法是如果派生类在自己定义中没有修改基类的虚函数,我们就指向基类的虚函数:如果派生类改写了基类的虚函数,这时续表

算法初级面试题05——哈希函数/表、生成多个哈希函数、哈希扩容、利用哈希分流找出大文件的重复内容、设计RandomPool结构、布隆过滤器、一致性哈希、并查集、岛问题

今天主要讨论:哈希函数.哈希表.布隆过滤器.一致性哈希.并查集的介绍和应用. 题目一 认识哈希函数和哈希表 1.输入无限大 2.输出有限的S集合 3.输入什么就输出什么 4.会发生哈希碰撞 5.会均匀分布,哈希函数的离散性,打乱输入规律 public class Code_01_HashMap { public static void main(String[] args) { HashMap<String, String> map = new HashMap<>(); map.p

c/c++ 函数、常量、指针和数组的关系梳理

压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和类型,c 中的数组参数是引用形式传参(传址调用),而常量标量是按值传递. //[]方括号表示声明的是数组,里面的数字表明了数组包含的元素数目 int states[50];//声明50个整数的数组 double code[365];//声明365个浮点数的数组 char chr[20];//声明20

C:函数:功能:实现字符数组中所有字母的倒序存放并输出

前两天小测碰到一道题,建立一个函数,功能:实现字符数组中所有字母的倒序存放并输出,一开始觉得简单跟数字数组差不多,运行一下发现很多格式错误,这些是不必要的错误,现在就来说下,先说一下代码思路:定义一个字符数组假如有n个字符,让一个指针变量*p指向首地址,*(p+n-1)就是末地址,然后实现*p与*(p+n-1)值的互换,这边让*q=*(p+n-1)每换一次,p++,q--,当p>q时退出循环,我们来看下代码: 1 #include "stdio.h" 2 char change(

2、函数内部属性 arguments是类数组对象,主要用途是保存函数参数,但这个对象中有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数

例如:(1).function factorial(num){ if(num<=1){ return 1; }else{ return num*factorial(num-1); } }//此时是递归算法 var trueFactorial=factorial;//将factorial复制给trueFactorial factorial=function(){ return 0; }//覆盖factorial函数 alert(trueFactorial(5));//0;因为辞职factorial

通过PHP current()函数获取未知字符键名数组第一个元素的值

通过PHP current()函数获取未知字符键名数组第一个元素的值 在开发中经常遇到这样问题,获取数组第一个元素的值,如果是数字索引那还好,直接$array[0],如果键名是字符串,你又未知这个字符串呢?用current()函数就可以做到. 当然,你可以用array_shift()函数,但是它会破坏原数组(即,删除数组中的第一个元素,并返回被删除元素的值). 关于 current() 函数: 每个数组中都有一个内部的指针指向它“当前的”单元,初始指向插入到数组中的第一个单元.用current(

array_flip() 函数返回一个反转后的数组

定义和用法 array_flip() 函数返回一个反转后的数组,如果同一值出现了多次,则最后一个键名将作为它的值,所有其他的键名都将丢失. 如果原数组中的值的数据类型不是字符串或整数,函数将报错 array_unique() 函数移除数组中的重复的值,并返回结果数组. 当几个数组元素的值相等时,只保留第一个元素,其他的元素被删除. 返回的数组中键名不变. 在PHP中,用于删除数组中重复元素有一个可用的函数,那就是 array_unique(), 但是它并不是一个最高效的方法,使用array_fl

【二】在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数。 ```java public class Test { /** 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数. public class Test { /** 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数. */ public static void main(String[] args) { int[][] arr =

《剑指Offer》——试题1:赋值运算符函数

题目:如下类型为CMyString的声明,请为该类型添加赋值运算符函数. class CMyString { public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(); private: char* m_pData; }; 关注点:      1.是否把返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(即*this).只有返回一个引用,才可以允许连续赋值(str1=st