诡异的数组用法

来源:互联网 发布:ubuntu下制作启动u盘 编辑:程序博客网 时间:2024/05/19 00:49
 

#include <stdio.h>
#include <string.h>

void fun(char c[])//传递的是数组,貌似和引用没区别,唯一的差别就是当c数组为const的时候,调用这个的时候直接用(char*)强转。
{  
 printf("%d\n" , sizeof(c));
 c[0] = 'm';
 c[1] = 'f';
}

void fun2(char &c) //传的是第一个值得引用
{  
 printf("%d\n" , sizeof(c));
 c++;
 printf("%c%d",c,111);
}

void fun3(char(&c)[9]) //传的是数组的引用,如果c为const,则不能用(char*)强转,类型不匹配
{   
 printf("%d\n" , sizeof(c));
    c[0] = 'x';

}

int main()
{
   /* const */char c[] = "12345678";
 //  char *c = "12345678";
 
    printf("%d\n" , sizeof(c));//9
    fun(/*(char*)*/c);
   printf("%s\n",c);
    fun2(*c);
   printf("%s\n",c);
    fun3(c);
 printf("%s",c);
    return 0;
}

 

  1. void print(const unsigned short (& r)[5]) {   
  2.     cout << "sizeof(r): " << sizeof(r) << endl;   
  3.   
  4.     for (size_t i = 0; i < sizeof(r) / sizeof(r[0]); ++i) {   
  5.         cout << r[i] << endl;   
  6.     }   
  7. }   
  8.   
  9. int main() {   
  10.     const unsigned short a[] = { 1122334455 };   
  11.   
  12.     print(a);   
  13. }  

 

 

 讲引用传入之后 也就讲数组的所有信息传入了, 可以用这样的方法把数组的大小来传入,

可是这样子还是很不好办,因为要是为每个长度的数组都写一个这样的函数,那我们就累都累死了..

该怎么办呢, 对了 我们想到了一个好的方法 模板

Cpp代码 复制代码 收藏代码
  1. template <typename T, size_t N> void print(const T (& r)[N]) {   
  2.     for (size_t i = 0; i < N; ++i) {   
  3.         cout << r[i] << endl;   
  4.     }   
  5. }   
  6.   
  7. int main() {   
  8.     const int c[] = { 1, 2, 4, 8 };   
  9.   
  10.     print(c);   
  11.   
  12.     const double d[] = { 3.14159, 2.71828, .57722 };   
  13.   
  14.     print(d);   
  15. }  

好的, 这样子看起来问题已经得到了很好的解决

可是熟悉模板的人一看就看出来问题了:如果这个函数的长度比较大,那么我们还是会在编译的时候为每个长度的数组创建一个函数,生成文件的大小还是会比较大,这么该怎么办呢?联想到了type_trails, 我们也可以做一个差不多的东西

Cpp代码 复制代码 收藏代码
  1. template <typename T, size_t N> size_t length(const T (&)[N]) {   
  2.     return N;   
  3. }  

 

 代码简单,尽量减少了需要的大小,应该来说是最好的解决方案了。为什么要说应该来说呢吗因为我们没用到STL 如果用到STL 中的Vector, 那么这么多事情我们也就不用来了。 呵呵

 

 

原创粉丝点击