- 浏览: 373556 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
"数组引用"以避免"数组降阶"(本文曾贴于VCKBASE\C++论坛)
受[hpho]的一段模板函数的启发,特写此文,如有雷同,实在遗憾。
数组降阶是个讨厌的事,这在C语言中是个无法解决的问题,先看一段代码,了解什么是"数组降阶"
为什么同样申明的array一个输出20一个输出4?这是因为void Test( char array[20] )中的array被降阶处理了,void Test( char array[20] )等同于void Test( char array[] ),也等同于void Test( char* const array ),如果你BT(开玩笑),它也等同于void Test( char array[999] )。
就是说
被降成
这样一来问题大了,你完全可以定义一个不足20个元素的数组,然后传给Test,坐等程序崩溃。在一些要求较高的场合就不能使用数组做参数,真TMD心有不甘。
那么在C语言中怎样解决这个问题?
没办法,应该说没有好办法。a:做个结构,其中仅一个char array[20],然后用这个结构指针代替char array[20]。可见这是个很繁琐的办法,且不直观;b:在Test内部使用_msize来计算array长度。这更不行,首先它使得错误的发现被推迟到运行期,而不是编译期,其次_msize长度/元素大小>=array长度,也就是说就是new char[19]和new array[20]分配的大小是一样的,这样一来,虽不至于导致程序崩溃,但运算结果却不正确。
感谢[hpho],受其启发,C++中有C所没有的"引用",但数组引用是怎样申明的呢?经过几番试验,Look
My test Code
link:http://hi.baidu.com/cdysxy1987/blog/item/313bbfd4d53df82506088b64.html
受[hpho]的一段模板函数的启发,特写此文,如有雷同,实在遗憾。
数组降阶是个讨厌的事,这在C语言中是个无法解决的问题,先看一段代码,了解什么是"数组降阶"
#include <IOSTREAM> using namespace std; void Test( char array[20] ) { cout << sizeof(array) << endl; // 输出 4 } int main( void ) { char array[20] = { 0 }; cout << sizeof(array) << endl; // 输出 20 Test( array ); }
为什么同样申明的array一个输出20一个输出4?这是因为void Test( char array[20] )中的array被降阶处理了,void Test( char array[20] )等同于void Test( char array[] ),也等同于void Test( char* const array ),如果你BT(开玩笑),它也等同于void Test( char array[999] )。
就是说
void Test( char array[20] ) { cout << sizeof(array) << endl; }
被降成
void Test( char* const array ) { cout << sizeof(array) << endl; // 既然是char*,当然输出4 }
这样一来问题大了,你完全可以定义一个不足20个元素的数组,然后传给Test,坐等程序崩溃。在一些要求较高的场合就不能使用数组做参数,真TMD心有不甘。
那么在C语言中怎样解决这个问题?
没办法,应该说没有好办法。a:做个结构,其中仅一个char array[20],然后用这个结构指针代替char array[20]。可见这是个很繁琐的办法,且不直观;b:在Test内部使用_msize来计算array长度。这更不行,首先它使得错误的发现被推迟到运行期,而不是编译期,其次_msize长度/元素大小>=array长度,也就是说就是new char[19]和new array[20]分配的大小是一样的,这样一来,虽不至于导致程序崩溃,但运算结果却不正确。
感谢[hpho],受其启发,C++中有C所没有的"引用",但数组引用是怎样申明的呢?经过几番试验,Look
#include <IOSTREAM> using namespace std; void Test( char (&array)[20] ) // 是不是很像 char *p[20] 和 char (*p)[20] 的区别? { cout << sizeof(array) << endl; } int main( void ) { char array[20] = { 0 }; cout << sizeof(array) << endl; Test( array ); }
My test Code
#include <iostream.h> // 参数为10个int的数组 // parameter is a reference to an array of 10 ints void putValues(int (&arr)[10]) { cout << sizeof(arr)/sizeof(int) << endl; } int main() { int i, j[2]; int a[10]; cout << sizeof(a) << endl; // putValues(i); // 错误:实参不是10个int的数组 // putValues(j); // 错误:实参不是10个int的数组 putValues(a); // 正确 return 0; }
link:http://hi.baidu.com/cdysxy1987/blog/item/313bbfd4d53df82506088b64.html
发表评论
-
FreeRTOS
2022-03-05 16:31 253Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 417https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1346https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 481https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 580// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 593https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5828583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 609参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2177基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9161 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1596OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1886ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 879转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1926转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1095C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 974转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 1006转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 821参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1623转自 http://blog.csdn.net/weixinh ...
相关推荐
### C#调用C++ DLL:结构体数组引用的传递及解析使用详解 #### 引言 在跨语言编程环境中,经常会遇到不同编程语言之间进行交互的需求。C#与C++之间的互操作就是一个典型场景。当C#需要调用C++开发的动态链接库...
C++指针数组内存释放 C++指针是一种基本变量,包含一个实际的数据,该数据代表一个可以找到实际信息的内存地址。指针是C++编程中非常重要的概念,许多程序和思想依靠指针作为他们设计的基础。 定义指针变量 定义...
在C++编程语言中,数组、引用和指针是三个重要的概念,它们是理解C++内存管理和数据操作的关键。下面将分别对这三个概念进行详细解释。 ### 1. 指针 指针是一个变量,它存储的是另一个变量的内存地址。在C++中,...
在C++编程语言中,数组和指针是两个非常重要的概念,它们在处理大量数据时发挥着关键作用。数组提供了一种方式来存储同一类型的多个数据项,而指针则是指向这些数据项的地址,使得我们可以高效地访问和操作数组。 ...
### C++Builder动态对象数组:TList类、DynamicArray与STL中的Vector容器 #### TList 类 在C++Builder中,TList是用于管理动态对象数组的一种方式。它提供了较为简便的方式来创建、管理和销毁一系列对象。TList...
C#中的字符串是引用类型,由.NET框架管理,而C++中的字符串可以是字符数组(char*)或宽字符数组(wchar_t*)。因此,传递字符串数组时,需要进行适当的类型转换。 1. **定义C++ DLL接口**: 在C++ DLL中,我们...
在C++中,二维数组通常以指针的形式传递,因为C++不支持引用参数。而在C#中,我们通常使用`unsafe`上下文来处理指针。 1. **C++ DLL的定义**: 在C++中,创建一个二维数组函数可能如下所示: ```cpp extern "C" ...
数组和C++标准库类模板vector是程序设计中的基本结构,了解数组和vector的声明、初始化、引用和操作是编程的基本技能。本章节对数组和vector进行了详细的介绍,希望读者能够掌握数组和vector的基本概念和操作方法。
在C++编程语言中,数组是一种非常基础且重要的数据结构,它允许我们存储相同类型的数据集合。本资源“zhizhenshuzu.rar”显然关注的是C++中的数组和指针数组的概念,这对于理解和操作内存以及高效编程至关重要。 ...
C++对数组的应用 C++中的数组是一种基本的数据结构,它可以...C++中的数组引用的机制可以解决数组降价问题,提供了一种灵活的方式来传递数组。然而,这种机制也存在一些限制,例如数组引用的大小必须在编译时确定。
本章主要介绍了C++中的一维数组,包括其使用背景、定义方式以及如何引用数组元素。 一维数组在C++中的应用广泛,尤其是在处理批量数据时,能够显著提高代码的简洁性和效率。在上述例子中,我们看到如何使用一维数组...
二维数组在C++中本质上是一级指针的数组,每个元素又是一个一级指针,指向一维字符数组。因此,二级指针可以用来直接访问和修改这些一维数组的内容。下面将详细解释这个过程: 1. **二级指针的声明**: 在C++中,...
【C++课程课件数组(郭艳燕老师)】课件涵盖了C++中关于数组的基础知识,主要包括以下几个方面: 1. **数组的概念**:数组是一种数据结构,它将具有相同类型的数据元素集合在一起,通过一个统一的名字进行表示,...
对于新手而言,掌握指针和数组的使用方法至关重要,因为这不仅有助于理解C++语言的深层次机制,还能为编写高效且安全的代码打下坚实的基础。 指针是C++中的一个变量,它存储了另一个变量的内存地址。指针的类型决定...
在实际编程中,常使用指针或者引用来处理数组参数,以便更灵活地操作数组。 六、动态数组与vector容器 虽然C++标准库中也有固定大小的数组(如std::array),但更常用的是动态数组(通过new运算符创建)和动态大小...
在C++中,数组是一种非常基础且重要的数据结构,它允许程序员存储一组同类型的元素。在数组详解中,我们将深入探讨一维数组、二维数组以及字符数组(即字符串)的定义、初始化、引用以及相关操作。 1. **一维数组**...
使用数组引用,我们可以先复制方块的当前状态到一个新的临时数组,然后在临时数组上进行旋转操作,最后再将结果写回原数组。这样可以避免对原数组的直接修改,确保操作的正确性。 此外,使用引用还可以减少内存开销...
通过上述内容的讲解,2013级C++程序设计的学生将掌握数组的概念、一维和二维数组的定义与引用、数组作为函数参数的使用以及字符数组和C++中字符串处理的方法。这些都是C++编程的基础知识,对于后续更高级编程概念的...
总的来说,C++和C#在数据传递上都支持值传递和引用传递,但C++需要明确选择引用或指针来实现引用传递,而C#总是进行引用传递。数组和列表在两者的处理方式上有共同之处,但C++的`std::vector`更强调内存管理和性能...
4. 头文件生成:提供一个头文件,声明这些数组和结构,使得在其他源文件中可以方便地引用。 5. 用户配置:允许用户自定义输出数组的名称、大小或其他参数。 使用转换后的C数组,程序员可以直接在代码中访问和渲染...