有两种传递方法,一种是function(int a[]); 另一种是function(int *a)

这两种两种方法在函数中对数组参数的修改都会影响到实参本身的值!

对于第一种,根据之前所学,形参是实参的一份拷贝,是局部变量。但是数组是个例外,因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的地址,数据还是在内存里的,函数在需要用到后面元素时再按照这个地址和数组下标去内存查找。也就是说后面的元素根本没到函数里来。所以,这里也不能在test()函数内部用sizeof求数组的大小,必须在外面算好了再传进来。

对于第二种,则是传址调用,无需再说。

这里还有几点需要注意:

1.在以上两个函数的形参前面加上const则表示整个数组只读,而不是只有首地址对应存储的数据只读。

2.第二种形式不能用C++11中的for...auto来循环打印。

3.数组的大小要用sizeof()来求,不能用.size(),因为.size()只有struct 或者union才能用, vector算是struct!

4.如果在函数内部又声明一个int* tmp类型的变量,然后把p赋值给tmp, 通过tmp修改数数组也是一样,都会修改实参本身!

#include <stdio.h>
#include <algorithm>
using namespace std; void test1(int[], int size);
void test2(int *p, int size);
//void test2(const int *p, int size); int main(void)
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int size = sizeof(a)/sizeof(int);
/*这里打印出的a值与test1(),test2()中的p值相等
*即地址值相同*/
printf("%p \n", a);
//test1(a, size);
test2(a, size);
int i;
printf("main: ");
for(i = 0; i < size; ++i)
{
printf("%d ", a[i]);
}
} void test1(int p[], int size)
{
printf("%p \n", p);
p[4] = 111;
printf("test1: ");
int i;
for(i = 0; i < size; ++i)
{
printf("%d ", p[i]);
}
printf("\n");
} void test2(int *p, int size)
{
printf("%p \n", p);
*(p+4) = 222;
printf("test2: ");
int i;
for(i = 0; i < size; ++i)
{
printf("%d ", *(p+i));
}
printf("\n");
}

  

C++中数组作为形参进行传递(转)的更多相关文章

  1. C++中数组作为形参的方法

    转载:https://blog.csdn.net/qq_33374294/article/details/90769668 原链接:https://www.cnblogs.com/abella/p/1 ...

  2. C++程序设计(关于函数中数组传递的一点心得)

    题目: 10个学生考完期末考试评卷完成后,老师需要划出及格线,要求如下: (1) 及格线是10的倍数: (2) 保证至少有60%的学生及格: (3) 如果所有的学生都高于60分,则及格线为60分:   ...

  3. C++中函数的形参为数组时,实质形参是指针

    C++中函数的形参如果为数组的话,那么进行实参传递时,实参实际上换转化成指针.参考下面的例子: #include<iostream> using namespace std; void f ...

  4. 转载:老生常谈C++中实参形参的传递问题

    以下文章转载自:http://www.jb51.net/article/108390.htm 函数中参数的传递 这里说的传递当然是指 实参是如何传递给形参的啦 还挺复杂的~~~~~~~~⊙﹏⊙b汗,这 ...

  5. 008android初级篇之jni中数组的传递

    008android初级篇之jni中数组的传递 jni中在native中数据类型的实际类型 jchar 占两个字节,跟native c中的char(占一个字节)是两个数据类型 jbyte, unsig ...

  6. JavaScript中函数的形参和实参的实现原理剖析

    我们都知道JS里面参数的传递是可以不一样的,比如我们有一个函数: <script type="text/javascript"> function one(a,b,c) ...

  7. C/C++中数组与指针的关系探究

    数组与指针 长期以来,在C/C++中,数组名和指向数组首元素的指针常量到底是以一种什么关系,一直困扰着很多人.很多地方,甚至是一些教科书中都在说,"数组名就是一个指向数组首元素的指针常量&q ...

  8. C++ 中数组做参数的分析

    C++ 中数组做参数的分析 1.数组降价问题? "数组引用"以避免"数组降阶",数组降阶是个讨厌的事,这在C语言中是个无法解决的问题,先看一段代码,了解什么是& ...

  9. C++怎么用二维数组作为形参传入

    原文地址:http://blog.csdn.net/xuleicsu/article/details/919801 如何将二维数组作为函数的参数传递 今天写程序的时候要用到二维数组作参数传给一个函数, ...

随机推荐

  1. supervisor管理nginx

    command = /usr/local/bin/nginx 这个命令默认是后台启动,但是supervisor不能监控后台程序,所以supervisor就一直执行这个命令. 加上-g 'daemon ...

  2. HTML5 canvas clearRect() 方法

    浏览器支持 Internet Explorer 9.Firefox.Opera.Chrome 以及 Safari 支持 clearRect() 方法. 注释:Internet Explorer 8 或 ...

  3. laravel学习笔记二

    代码编写提示工具

  4. tqdm介绍及常用方法

    Tqdm 是一个快速,可扩展的Python进度条,可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator). 使用pip就可以安装. Tqdm 是一 ...

  5. 如何判断app的页面是原生的还是H5的webview页面

    1.看布局边界(在手机侧观察) 开发者选项->显示布局边界,页面元素很多的情况下布局是一整块的是h5的,布局密密麻麻的是原生控件.页面有布局的是原生的,否则为h5页面.(仅针对安卓手机试用)如下 ...

  6. Spring Security(三十七):Part IV. Web Application Security

    Most Spring Security users will be using the framework in applications which make user of HTTP and t ...

  7. OpenCV——图像处理入门:膨胀与腐蚀、图像模糊、边缘检测

    全部外部依赖项: opencv_aruco341d.lib opencv_bgsegm341d.lib opencv_calib3d341d.lib opencv_bioinspired341d.li ...

  8. Nginx(三)------nginx 反向代理

    Nginx 服务器的反向代理服务是其最常用的重要功能,由反向代理服务也可以衍生出很多与此相关的 Nginx 服务器重要功能,比如后面会介绍的负载均衡.本篇博客我们会先介绍 Nginx 的反向代理,当然 ...

  9. vc图像合成

    本程序下载地址: 上一篇讲述了tiff格式图片拆分成多张图片, 这篇博客讲述如何把多张任意格式的图片合成为一张图片. 图像合成仍然需要借助Cximage图像库,合成函数为Mixfrom, 函数原型为: ...

  10. 【转】SpringBoot启动服务的三种方式

    1.IDEA启动 2.命令行启动 首先将命令行位置跳转到当前项目的根目录下,再输入“mvn spring-boot:run”命令,初次操作maven需要下载插件等待几分钟 3.命令行编译为jar启动 ...