首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C 语言】数组 ( 一维数组退化 | 二维数组退化 | 函数等价关系 )

文章目录 一、一维数组退化 二、二维数组退化 三、数组等价关系 一、一维数组退化 ---- C 中将 一维数组 作为参数 , 传递到函数中 , 该 一维数组 会退化为 指针 ; 将 int...数组时 , 不知道该数组的元素个数 , 编译器只能确认 , 该参数一个 int * 指针类型 ; 这样操作是为了提高 编译器 的效率 , 提高程序执行的效率 , 函数的 最终要拷贝到 栈内存...[][20]) { } int (*array)[20] : 此处注意 , 数组指针 指向的 一维数组 完整的数组 ; void fun(int (*array)[20]) { } 三、数组等价关系...也是 指针 , 则为 二级指针 ; 实参为 二维数组 int array[10][20] , 等效的 为 一级指针 int (*array)[20] ; 二维数组数组的元素 一维数组...; 外围数组 ( 第二维 ) 退化为 指针 , 指针 指向的元素 一维数组 , 则为 指向 一维数组 的指针 , 每个一维数组有 20 个元素 ;

2.8K10

C言中关于通过传递数组的长度计算的一些思考

本文链接:https://blog.csdn.net/solaraceboy/article/details/103187291 C言中关于通过传递数组的长度计算的一些思考 一 背景 学习 C...思路这样的:通过参将数组传递给长度计算函数,长度计算函数计算完成之后返回数组长度。但是在实际实践过程中遇到了问题,请继续往下看!...length; } 执行结果: The length of this array is: 2 The length of this array is: 5 三 结果分析及总结 3.1 第一个结果,通过传递给数组长度计算函数来计算数组长度...3.3 通过查阅相关资料,得出以下结论: a[] 长度计算的形式参数,在 main)() 函数中调用时,a 一个指向数组第一个元素的指针。...sizoef a 的结果指针变量 a 占内存的大小,一般在 64 位机上8个字节。a[0] int 类型,sizeof a[0] 4个字节,结果2。

1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    c++:*与&, *&p, 指针传递,引用传递,数组

    (&p) = p p指针,&p为p的地址 (取包有内容p的盒子的编号) 再进行解引用(拆开盒子),所以得到 *&p = p 指针传递 出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用...”; } void main() { int b = 10; test(&b); cout << “b的值:” << b << “\n” << “b的地址:” << &b << “\n”; } ...10; test(b); cout << “b的值:” << b << “\n” << “b的地址:” << &b << “\n”; } 相当于变量的别名,函数内后续的任何改变都会影响原变量 数组...当要使用数组作为函数时,因为一个数组不能使用另外一个数组初始化,也不能将一个数组赋值给另外一个数组,而在“1.1 非引用”中提到要用实参的副本来初始化形,所以实参为数组时,不能直接传递给...FindMax(int array[10]); 虽然不能直接传递数组,但是函数的可以写成数组的形式。

    33720

    C语言:数组作为函数参数(数组元素做实参,数组名称做

    数组元素的值做实参 数组元素作为实参时,将数组元素的值传递给,传递的方向从实参向的单向值传递。 例:编写函数求一维数组的最大值。...a:b; } 数组名称做数组作为时,虽然形式上还是数组,比如void sort(int arr[ ]),但是并不意味着真正建立了一个包含和实参数组大小相同的数组,在调用函数时也不对它分配存储单元...,只是用array[ ]这样的数组形式表示array一维数组名,来接收实参传来的地址,因此array中的方括号的数值并无实际作用,编译器对数组维度进行忽略。...,向参变量传递的数组元素的值 用数组名做函数实参时,向传递的数组首元素的地址。...数组名作为函数实参传递时,函数定义处作为接收参数的数组类型既可以指定长度也可以不指定长度。 数组元素作为函数实参传递时,数组元素类型必须与参数据类型一致 。

    2.8K20

    指针数组做main函数的

    指针数组 1.1 基本概念 指针数组指一个数组,其中的每个元素都是指针。 这意味着数组中的每个元素都存储一个地址,该地址指向内存中的某个位置。...指针数组的声明形式为: data_type *array_name[size]; //示例: int *p[10];//该指针数组包含10个整型地址 1.2 简单示例 以下一个简单的示例,演示了如何声明和使用指针数组...指针数组做main 2.1 int main(int argc, char *argv[]); 指针数组的一个重要应用是做main函数的。...如果main函数带参数的话,则第一个参数必须int型,第二个参数必须字符指针数组 char *xx[],参数只能由操作系统给出。...【谭浩强】C语言自学\output\mytest.exe */

    10510

    C++string类作为传值,实参与的变化

    C++问题: 使用函数调用,排序string字符串数组从小到大,没有使用指针和引用,为什么实参也会改变?...string> using namespace std; int main() { void sort(string []); string array[3] = {"l" , "love" , "c+...,也就是说实参对传的地址,此时参与实参为同一个地址,在改变形也会改变,所以string类与数组时一样,string类的一个指针,接受的字符串首个字符地址,其中数组类型在存贮数据连续线性存贮的...,而string类在存贮字符串数组则是存贮每个字符串首字母的地址,比如a[3] = {"I","love", "c++"}中a[2]为第一个字符串的地址,也就是love种l的地址,这样一来string类字符串数组的每一个字符串长度没有限制...这是关于C++中string类比C言中数组类型的改进。

    1.3K20

    C语言-指针作为函数类型

    前言 C语言函数里最常用就是指针传和返回地址,特别是字符串处理中,经常需要封装各种功能函数完成数据处理,并且C语言标准库里也提供了string.h 头文件,里面包含了很多字符串处理函数;这些函数的参数和返回值几乎都是指针类型...c=*a; *a=*b; *b=c; } //return语句只能返回一个值 //如果函数想返回多个值,可以使用指针()实现。...注意: 从大到小或者小到大排序可以通过函数区分。...='\0'){} return str-p-1; } /* 函数功能: 实现字符串排序.支持从小到大或者大到小 函数: char *p 将要排序的字符串 char flag 选择排序方式...局部变量默认值随机值(系统没有赋值) 静态变量默认值0 */

    1.6K30

    C语言和实参的区别?

    实参程序中已经分配了内存空间的参数,它可以被赋予一个具体的值,比如常数、数组、地址(指针),也可以是一个变量名、数组名或表达式,当然也包括指针变量。...则是你在写一个被调函数时,为了说明用到的自变量的类型、要进行什么操作而定义的,在调用函数前它不会被分配内存空间,更不会被赋予具体的值。...调用函数时,参会被分配一个新的内存空间,实参的值就会被“复制”进去,让它在被调函数中参与运算。而实参本身不参与这个运算,它仅仅起到一个传递值的作用(不过在C++中可以用&改变实参的值)。...如果参数的形式指针,那么“复制”的就是地址。

    1.7K10

    C语言和实参的区别?

    实参程序中已经分配了内存空间的参数,它可以被赋予一个具体的值,比如常数、数组、地址(指针),也可以是一个变量名、数组名或表达式,当然也包括指针变量。...则是你在写一个被调函数时,为了说明用到的自变量的类型、要进行什么操作而定义的,在调用函数前它不会被分配内存空间,更不会被赋予具体的值。...调用函数时,参会被分配一个新的内存空间,实参的值就会被“复制”进去,让它在被调函数中参与运算。而实参本身不参与这个运算,它仅仅起到一个传递值的作用(不过在C++中可以用&改变实参的值)。...如果参数的形式指针,那么“复制”的就是地址。

    3.9K20

    C 语言】数组 ( 多维数组做函数退化为指针过程 | int array -> int array -> int (*array) )

    文章目录 一、多维数组做函数退化为指针过程 1、使用 int array[2][3] 作函数参数 2、使用 int array[][3] 作函数参数 3、使用 int (*array)[3] 作函数参数...一、多维数组做函数退化为指针过程 ---- 一维数组 作为 函数参数时 , 会退化为指针 ; 解决方案 传入 数组首地址 和 数组元素个数 ; 如果 多维数组 作为 函数参数时 , 也存在退化问题...; 1、使用 int array[2][3] 作函数参数 使用 int array[2][3] 作为函数参数 , 可以完整打印出二维数组中的值 ; #include #include...i, j, array[i][j]); } } } /** * @brief main * @return */ int main() { // 声明一个 二维数组...array[2][3]; // 循环控制变量 int i = 0, j = 0; // 赋值时使用的索引值 int index = 0; // 为 二维数组

    58010

    C:数组的本质

    注意:数组arr,而不是arr[10] 数组该怎么写呢?...1.我们传递的不是整个数组,函数的部分不会真实创建数组的,所以就不需要数组大小,也就是部分元素大小写不写都无所谓,没有什么影响 2.数组传过去的数组首元素地址,地址应该拿指针来接收,所以函数部分应该使用指针变量来接收...从上图中,我们可以看到二维数组传递的也是数组名,数组名是什么呢? 数组数组首元素的地址,所以二维数组实参传递的地址,既然传递的地址,那么也就可以使用指针来接收。...如果不使用圆括号,arr就不再指针变量,而是会与[5]结合变为数组名。 C:指针学习-指针变量—学习笔记-CSDN博客 如果对于数组指针有一些不明白的地方,可以看一看这篇文章哟!...3、总结: 数组传递的都是地址,所以都可以使用指针来接收 一位数组传递的首元素地址,使用(类型)指针来接收, 二维数组传递的一维数组的地址,使用数组指针来接收 本篇文章到这里就结束了

    6510

    详解C言中数组

    但是,我们该如何从数组中读出我们出入的数据呢? 这部分的知识比较重要! 4.1 数组下标 C语言规定数组有下标的,并且 下标从0开始的(这个点一定要记住,新手特别容易犯错的点!)。...如下: int arr[10] = {1,2,3,4,5,6,7,8,9,10}; 在C言中提供了一种的操作符 —— [] ,这个运算符就做下标引用操作符。...之后你就改了,但是可怕的事情发生了,你之前所用的所有遍历数组,乃至给函数传时,用的都是常量的数组大小(比如上述数组的“10”),这样的话得修改的猴年马月啊!所以这种写法存在一定的弊端。...sizeof操作符C语言的一个关键字,可以计算类型或者变量的大小的,其实sizeof也可以计算数组的大小。单位字节。...C⾔规定,⼆维数组的⾏从0开始的,列也是从0开始的,如下所⽰: int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7}; 图中的最左侧的数字表示行号,

    11510

    C言中函数参与实参的区别

    众所周知一个函数有两种参数,即和实参。那么究竟什么什么实参呢? :在定义函数时指定的参数,在未出现函数调用时,他们并不占用内存中的存储单元。...注意:和实参实际上占用的两份不同的存储单元。  和实参之间的传递 在c言中,实参与的数据传递“值传递”,单向传递,只能由实参传给,不能由传递给实参。...这种传递方式采用的单向值传递,实无联系,改变不影响实参。 2、按地址传递(通过操作可能会改变实参) 按地址传递主要出现在函数参数指针变量、数组等的时候。...注意: 实质上用指针做函数参数的情况下,在调用函数时,将实参变量的传递给参变量,采取的依然单向值传递。...如果在被调函数中只是单纯改变了指针变量的值,在函数调用结束后这些被销毁,不会影响调用函数时传入实参指针变量值。

    1.1K20

    详解C言中数组指针与指针数组

    ·详解数组指针与指针数组 ·数组指针 一、区分 首先我们需要了解什么数组指针以及什么指针数组,如下图: int *p[5]; int (*p)[5]; 数组指针的意思即为通过指针引用数组,p先和*结合...,说明了p一个指针变量,指向一个大小为5的数组。...2.运算 由于指针指向的一个地址,因此数组指针也同样可以进行相关运算;例如指针的加减可以实现指针指向数组上一个或者下一个元素的功能。这边需要说明,数组指针中进行乘法和除法没有意义的。...四、数组指针作函数参数 下面几种传的方式: void test() { int arr[3][5] = {0}; print(arr); } void print(int arr[3][5])...下面一个一级指针传的例子: #include void print(int *p, int sz) { int i = 0; for(i=0; i<sz; i++) {

    3K20

    c语言二维数组传参数_c语言数组

    你的点赞✌️,我前进的动力。 初遇二维数组作函数参数,宛如自己化身为了大头儿子。很头大。 不禁大声呐喊:该怎么声明定义,该怎么调用,又该怎么函数中操作元素和地址?...第一种为二维数组 声明 void function(int a[m][n]);//函数声明 void function(int a[][n]);//不论多少维数组,第一维都可省略。...第二种数组指针 (其实只是 声明定义 与第一种不同,其他一样) 声明 void function(int (*a)[n]); //不是(int *a[n])(指针数组) ,而是(int (*a)...第三种为二级指针 声明 void function(int **a,int n);n表示第二维数组长度,即列宽 调用 function( (int **)a,int n);//实参不能为数组名!...万能的。 声明,定义一样的。 同时,把元素外层()剥去就代表地址。 喜欢就为我点赞,评论加收藏。

    2.8K10
    领券