首页
学习
活动
专区
工具
TVP
发布

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

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

2.7K10
您找到你想要的搜索结果了吗?
是的
没有找到

指针数组做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[],参数只能由操作系统给出。...2.2 简单示例 下面例子中,argc 表示命令行参数的数量,而 argv 一个指针数组,其中每个元素都是一个指向字符串的指针。程序通过循环遍历 argv 数组,输出每个命令行参数的内容。

7910

【JavaScript】函数 ③ ( 与 实参 匹配问题 | 实参个数 = 个数 | 实参个数 > 个数 | 实参个数 < 个数 )

; 在 JavaScript 中 , 对 和 实参 的 匹配要求比较宽松 , 即使二者 个数 不匹配 , 也不会报错 ; 2、参与实参个数匹配 如果 实参 的个数 , 与 个数一致 , 则正常输出结果...传入 2 个实参, 输出正常结果 add(1, 2); 输出结果为 3 ; 3、实参个数 > 个数 如果传入的 实参个数 大于 个数 , 则取 个数个 实参 ; 下面的代码中..., 有 2 个 , 传入 3 个实参 , 此时函数只接受 前 2 个实参 , 第 3 个实参不接收 , 也就不参与函数运算 ; // 定义函数 有 2 个 function...传入 3 个实参, 只接受前 2 哥实参 add(3, 4, 5); 取 实参的 前 2 个进行运算 , 也就是只接受 3 和 4 , 将其相加后得到 7 , 因此最终的函数计算结果...7 ; 4、实参个数 < 个数 如果 传入的 实参个数 小于 个数 , 那么 后面 没有实参对应的 , 就被当做 声明后未赋值的变量 , 默认值就是 undefined ; 下面的 add

5510

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]); 虽然不能直接传递数组,但是函数的可以写成数组的形式。

24020

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

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

2.4K20

-实参概念剖析

实参: 可以是常量、变量、表达式、函数等, 无论实参何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给。 因此应预先用赋值,输入等办法使实参获得确定值。... :即函数的自变量,其初值来源于函数的调用。只有在程序执行过程中调用了函数,才有可能得到具体的值,并参与运算求得函数值。...和实参的区别: 1、英文名字不同:parameter,实参argument。 2、本质不同:的本质一个名字,不占用内存空间。实参的本质一个变量,已经占用内存空间。...站在函数里面,你能看到的函数参数就是--。 //内部有效 2 .站在函数外面,你调用函数输入的参数就是--实参。...所谓的实参害人不浅,概念的抽象应该是简化和解释逻辑,结果这个两个名称最让初学者理解不了。应该是最初翻译带来的弊端。 举例: 1.

1.2K20

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

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

1.2K20

Java静态方法和实例方法 java中的数组作为传入

Java静态方法和实例方法 java中的数组作为传入 Java虚拟机 启动一个Java程序的时候,会诞生一个虚拟机实例,当程序关闭退出时,该实例会消失。...句柄池 句柄池有两部分,一个指向对象变量的指针 a e = new a() 其中,储存的执行对象变量的指针,即指向栈中e的变量的地址 还有一部分指向方法区中的指针 即指向方法区中类a的指针 对象锁...虚拟机中每个对象都有一个对象锁,用于协调多个线程访问同一个对象时的同步 关于数组 在Java中和js一个样子 数组即对象,对象即数组 数组储存在堆中的 所以,在调用方法的时候传入数组即传入了对象,这个时候...当方法调用完成以后,会弹出帧,销毁内容 关于方法调用传入数组和变量的的区别,数组一个对象,指向堆中的一块储存地址,变量,属于当前方法帧中的方法栈,调用的时候会直接压栈,调用完成以后会执行出栈操作。...所以传入变量不会保存,传入数组会保存更改 Java栈上的数据所有数据此线程私有的。不能被其他线程共享 堆 会被共享,方法区会被共享 静态方法和实例方法 静态方法会在程序运行的时候直接装载进入方法区。

1.3K10

【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; // 为 二维数组

54910

shell数组变量赋值_可以是常量变量或表达式

bash 支持一维数组(不支持多维数组),并且没有限定数组的大小。 类似于 C 语言,数组元素的下标由 0 开始编号。...定义数组的一般 式为: 【示例】定义数组:array_name=(value0 value1 value2 value3) 数组的值类型任意,个数不限 可以不使用连续的下标,而且下标的范围没有限制...:array_name=([0]=value0 [3]=value3 [5]=value5) 【示例】定义数组 2.读取数组 读取数组元素值的一般格式:{数组名[下标]} @或*获取数组中的所有元素...[索引]} 【示例】读取数组: 【示例】读取数组所有元素 【示例】读取数组长度 【示例】读取数组中指定元素的字符长度 3.数组拼接 所谓的数组拼接就是将两个数组连接成一个数组。...【示例】数组拼接 4.数组删除 删除数组可以删除数组中指定元素,也可以删除整个数组

59410

基于堆栈内存详析 Java函数传值还是引用?

Java的引用 及 Java函数传值还是引用 Java中没有指针的说法,Java中的引用就类似于C++的指针, Java的引用是栈区的一个变量, 如果引用的基本数据类型,那它存储着就是栈区的一块内存...,(因为普通基本数据类型由栈区管,long、int、short、byte、float、double、string、boolean),做传值调用; 如果引用的new出来的实例(new String...('a')也算,直接写'a'则存在栈区),则这个引用存储的堆区一块内存的地址(这个时候就类似于C++的指针),做传引用调用,即C++中的传指针调用; C++中—— 传值调用:的值跟传来的变量的值没有底层联系...,各不相犯; 传指针调用:的值跟传来的变量的值同一块内存的地址,可以修改同一块内存的东西,但是跟传来的变量两个不同的变量; 传引用调用:只是取别名,传来的变量的另外一个名字,跟传来的变量同一个变量...;【C++中的引用就是另外一个变量的别名,实际上跟那个变量同一个变量】 C++指针与Java引用的区别 C++的指针存储的一个变量的地址,*指针这个变量的内容!

81230

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

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

1.4K30

实参与究竟有什么不同

那么,return x + y 这行代码里,x 与 y 实参,还是呢? 我个人的见解,在函数里再去辨别他们已经没什么意义,如果一定需要一个答案,那么,我认为它们,而不是实参。...答案。实参,不是一个具体的事物,它是一个概念,这个概念只在调用函数传入参数时才有意义。 为什么要有形和实参这两个概念呢?...,规定了函数的样式,一种形式的约定,强类型语言还会约定一个的类型。实参,实际调用时传入函数的数据,因此叫实参。...实参与两个维度的事物,一个强调形式,一个强调实际数值,因此我说,他们两个维度的事物,静态的概念,实参动态的概念,我执行add(3, 5), 函数的实参就是3, 5。...在函数内,的值,由实参决定的,在函数执行之前,你不知道x 和 y 的值是什么,只有函数实际被执行,被调用,在函数内,你才知道的实际数值是什么。

1.2K30

C语言和实参的区别?

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

1.7K10
领券