c 数组做为形参时 该参数退化为指针

当数组做为函数的形参的时候,该参数退化为指针,并且是无法直接求得数组的大小。

传数组给一个函数,数组类型自动转换为指针类型,因而传的实际是地址。

void func(int array[10])

void func(int array[])

void func(int *array)

所以以上三种函数声明完全等同。

实际情况是,数组做参数,完全无法按值传递。这是由C/C++函数的实现机制决定的。

通常计算数组大小的方式如下:

int len = sizeof(arr)/sizeof(type)

利用总长度和单个元素的长度关系得到数组的长度

但做为形参后,sizeof(arr)的长度总为4,即一个指针的长度。

为此,有两种方法来解决这个问题:

方法1.

参数传递的时候,直接加上一个参数做为数组的长度

方法2.(是错误的)

int *p = a[0];

int iLen = 0;

while(p != NULL)

{

iLen++;

*p++;

}

c 数组做为形参时 该参数退化为指针

时间: 2024-10-31 19:34:08

c 数组做为形参时 该参数退化为指针的相关文章

C语言 数组做函数参数退化为指针的技术推演

//数组做函数参数退化为指针的技术推演 #include<stdio.h> #include<stdlib.h> #include<string.h> //一维数组做函数参数退化为指针的技术推演 void printfA(char * strarr[3]); //计算机中,数组都是线性存储,二维数组元素也是一个个的排列的 //例如: 1,2,3,4,5,6,7,8,9 像这组数据 我们可以认为是一维数组 int a[9]={1,2,3,4,5,6,7,8,9}; //也

c语言数组做函数参数退化为指针

我的系统是MAC OS 64位.根据自己的系统位数不同是有差异的.以下是我学习过程中遇到的问题 大侠略过... 有时候我们想通过一个函数对数组的元素进行操作,在sizelen函数中想想通过sizeof获得数组的长度. 想法是好的,不要以为你对C语言很了解了.其实数组在做函数参数是只是传了,一个指针.也就是数组 的首地址. 从结果可以看出,C编译器确实是这么做得.我的系统是64位,所以int *是占8个字节. 以上只是我学习过程中遇到的问题.大侠略过...

第三周 项目五-数组做数据成员(四)文件操作-指针

/* * Copyright (c) 2015, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:冷基栋 * 完成日期:2015年 3 月 21 日 * 版 本 号:v1.0 */ 代码 #include <iostream> #include <cstdlib> #include <fstream> using namespace std; const int N=500; class Salary { p

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

C++ 中数组做参数的分析 1.数组降价问题? "数组引用"以避免"数组降阶",数组降阶是个讨厌的事,这在C语言中是个无法解决的问题,先看一段代码,了解什么是"数组降阶" 1 #include <IOSTREAM> 2 using namespace std; 3 4 void Test( char array[20] ) 5 { 6 cout << sizeof(array) << endl; // 输出 4

二维数组做函数参数、指向指针的指针做函数参数

这里有一篇文章  写的很好http://blog.csdn.net/f81892461/article/details/8974087 该文章中有一句话  总之就是:数组无法作为参数,总会被编译器将地址赋值给形参指针的,即使指针定义成数组形式,也还是指针.然后各种差别都是由数组和指针不同的定位元素的方式导致的. 这句话说的很对啊,数组做形参的是时候都是被当成指针来处理的.不明白这句话的可以看一下,参考文章链接里的那幅图,注意比较一下下图中的两个:data+1,第一个data+1指向的是元素dat

【C】数组做形参

前言 有时候想把一维.二维数组作为实参传入被调函数,有什么特殊么? 普通参数做实参 普通参数传入,其实是传入了一个copy,函数内对形参的操作并不能影响实参. 一维数组做实参 一维数组的传入,其实传入的是数组的首地址,函数内操作的也是数组真实的内存地址里的数据. 所以,以下三者是等价的 void func(int *a) void func(int a[]) void func(int a[5]) 用法:一般的,数组作为参数传入,第一个形参是首地址,第二个形参是数组的size. 二维数组做实参

【C语言】二维数组做形参

二维数组有两种形式: ①在栈上: int a[4][4] = {...}; ②在堆堆上: int ** a = new int *[4]; for(int i = 0; i < 4; i++) a[i] = new int[4]; 这两种情况下,二维数组做形参的传参方式是不一样的. ①在栈上时 void fun(int * a, int rownum, int colmunnum)   //形参传递按照一维指针 { ... a[r * colmunnum + c] = ...;     //根据

C++数组做参数

首先,看一下下面这段代码: void changearr(int a[],int n){    cout<<sizeof(a)<<endl;         // 输出4}int main(){    int a[10] = {2,78,100,88,12,55,45,0,1,2}; cout<<sizeof(a)<<endl;         // 输出40    changearr(a,10);    return 0;} 在C++中,数组名就是指向数组

0709 C语言常见误区----------二维数组做参数

总结: 1.二维数组名是指向一位数组的指针,本例中,其类型为 int (*)[4],在传递的过程中丢失了第一维的信息,因此需要将第一维的信息传递给调用函数. 关于二维数组名代表的类型,可通过下面的例子看出. 1 /************************************************************************* 2 > File Name: test_2arr.c 3 > Author:Monica 4 > Mail:[email prot