-
对于用指向多维数组的指针做函数参数一些认识
2019-03-16 17:09:38可以有两种方法:用指向变量的指针变量和用指向一维数组的指针变量做函数参数,下面对于这两种方法做基本的阐述。 一、定义描述 (一)、用指向变量的指针变量做函数参数 首先,我们定义一个二维数组source[3]...对于用指向多维数组的指针做函数参数一些认识
首先,我们知道,一维数组可以作为函数参数,同时,多维数组也可以作为函数参数,用来接收实参组名传来的地址。可以有两种方法:用指向变量的指针变量和用指向一维数组的指针变量做函数参数,下面对于这两种方法做基本的阐述。
一、定义描述
(一)、用指向变量的指针变量做函数参数 首先,我们定义一个二维数组source[3][4],定义一个返回值为指针数据类型的函数:*search(int p)。当我们用指向变量的指针变量做函数参数时,我们传递的是数组首行、首列元素的首地址。因此,在函数内进行操作时,我们可以通过(p+i)来操作第i个数组元素,来返回他的地址。
(二)、用指向一维数组的指针变量做函数参数 同样,定义一个二维数组source[3][4],,定义一个返回值为指针数据类型的函数:*search(int (p)[4])。此时,我们在操作这个函数时,传递给函数的是首行的地址,因此,在函数体内部,(p+i)才指的是第i行首元素的地址。
二、应用举例:寻找第k名同学的成绩
(一)、用指向变量的指针变量做函数参数
int main()
{ int *search(int *p,int n);
int source[3][4]={{99,99,99,99},{99,99,99,99},{88,88,88,88}};
int k,i;
int *p;
scanf("%d",&k);
p=search(source,k);
for(i=0;i<4;i++)
{
printf("%d ",(p+i));
}
}int *search(int *p,int n)
{
int *flag;
flag=p+(n-1)*4;
return flag;
}
(二)、用指向一维数组的指针变量做函数参数
int main()
{
int *search(int (*p)[4],int x);
int source[3][4]={{99,99,99,99},{99,99,99,99},{88,88,88,88}};
int k,i;
int p;
scanf("%d",&k);
p=search(source,k);
for(i=0;i<4;i++)
{
printf("%d ",(p+i));
}
}
int *search(int (*p)[4],int x)
{
int flag;
flag=(p+x-1);
return flag;
} -
数组
2021-01-18 08:51:36C语言数组 数组的中括号只有在定义的时候表示数组的大小,其余情况都表示下标 ...数组做参数时,传递的是数组的首地址(1.第一个数组元素的地址 2.数组名) 形式参数表示方法 数组括号中大小无效 ... -
【C语言】参数传递使数组名退化为指针
2020-09-13 16:01:00引入 做题的时候发现了一道题,...在main函数定义数组并使用数组名自增时,编译器会报错,那为什么在while循环中可以自增?是因为while有神奇的魔力吗?显然不是,是因为在参数传递的时候,数组名在传递过程中发生了引入
做题的时候发现了一道题,想了很久也没有想出来与给出算法相符合的思路
最后写了个可以勉强得出结果,但是好像不怎么对的方法
因为题目给出的变量都已经使用过,所以只能使用数组名作为增量向后遍历
但是这时就出现了问题,数组名竟然不指向首地址元素了,事后想想也知道如果一直指向首元素那么显然不能通过这种自增数组名的方式遍历数组
在main函数定义数组并使用数组名自增时,编译器会报错,那为什么在while循环中可以自增?是因为while有神奇的魔力吗?显然不是,是因为在参数传递的时候,数组名在传递过程中发生了“退化”,从数组名这个特殊的类型退化成了指针,而指针自然时可以通过自增后移的
数组名退化为指针
数组名代表的是一个内存块及这个内存块中的元素类型 。只是在大多数情况下数组名会“退化”
算术运算与数组取下标操作符时退化为指针在作为右值参与运算的时候,数组名会自动”退化“为指向首元素的指针
如:
char a[] = "hello"; char *p = a + 1;
数组取下标操作符
[ ]
,在c标准中对它的定义是等价于*(p + offset)运算
。也是就说,你写a[3]其实等价于*(a+3),可以看到括号内是一个算术运算,于是a“退化”为一个指针,随后参与进行计算和解引用。
根据加法的交换律,我们也可以写成*(3+a),也是就3[a]。
函数调用传递数组时退化为指针
我们学在给函数传递数组的时候,经常会听到“按值传递机制和按引用传递机制 ”这样的说法(网上也有很多),即传递数组是“按引用传递的”,这也是为什么传递数组在函数内读写数组,退出函数后数组会发生变化的原因。
实际上C语言参数传递只有一种:
值传递
几种定义数组参数方式:
void test(int a[5]) void test(int [5]) void test(int*)
许多人认为,第一种写法是最好的,清晰(这个是对的,对于代码阅读者而言)而且可以告诉编辑器这个数组的大小。
但是,这三种声明在编译器看来只有一种:void test(int*)test函数得到的是一个值为a“退化”后指向数组首元素(内存块首地址)的指针 ,在test内部是不知到a是一个数组的,它仅仅认为它是一个整数指针。
但是我们依然可以使用数组取下标操作符进行运算,因为即使a是一个数组名,它被用作数组取下标操作符的操作数时也会“退化”为指针
-
JAVA数组常见问题以及数组拷贝的几种方式
2020-12-27 10:54:01java数组常见问题数组的定义数组的属性数组访问的问题1. 数组越界2. 指向空指针3. 数组作为参数传递数组转字符串1....数组可以作为函数参数进行传递 数组可以作为返回值进行返回(c语言可是做不到的java数组常见问题
数组的定义
数组是一块连续的内存,存放相同数据类型的集合。
在java中数组也叫数组对象
数组可以作为函数参数进行传递
数组可以作为返回值进行返回(c语言可是做不到的)//静态初始化(静态初始化只有第一次定义可以) int[] array = {1,2,3,4,5,6}; //动态初始化 int[] array2 = new int[10];//未初始化,默认值为0 int[] array3 = new int[]{1,2,3,4,5,6};//后面的[]中不能写数字,长度会自己判断 类型 引用 对象 //匿名数组(可以作为返回值或者参数)缺点是只能用一次 fun(new int[]{1,2,3,4});
补充:
引用就是一个变量,里面存放的值是一个地址
引用不一定在栈上,但是对象一定在堆上
引用是不能指向引用的
数组的属性
打印数组的三种方式:
//1.for 可以拿到下标 for(int i = 0;i < array.length;i++){ System.out.println(array[i]); } //2.foreach 只能拿到数组的值 for(int i : array.length){ System.out.println(i); } //3.Arrays.toString 将数组转化为字符串进行输出 String str = Arrays.toString(array); System.out.println(str);
数组访问的问题
1. 数组越界
数组可以访问的下标范围为 0 --> arry.length-1,若访问越界,会抛出数组下标越界异常
2. 指向空指针
当执行 array = null; 时 array指向空指针
- array 不指向任何的对象,若此时访问 array,或者打印数组的长度时,会抛出空指针异常
- 此时array之前所指向的内容会被jvm自动垃圾回收(即当对象没有引用在指向的时候这个对象会被自动回收)
3. 数组作为参数传递
public static void main(){ int array = new int[]{1,2,3,4} print(array); System.out.println(array[0]); } public static void print(int array2){ for(int i : array.length){ System.out.println(i); } array2[0] = 0;//在这里修改了array2指向的内容,外面也会受到影响 }
两个引用指向同一个对象,不管你去修改哪一个引用的值,其他的地方都会受到影响
数组转字符串
1. Arrays.toString()
//1.Arrays.toString实现 int[] arr = new int[]{1,2,3,4}; System.out.println(Arrays.toString); //输出结果:[1,2,3,4]
2. 重写toString方法
public static String toString(int arr[i]){ }
数组的拷贝
关于深拷贝和浅拷贝:
如果把 arr1 拷贝到 arr2之后,将arr2中的元素修改,arr1中的元素不受影响,称为深拷贝以下四种方式对于引用类型来说都是浅拷贝,对于基本数据类型是深拷贝
1. 通过for循环
arr = [1,2,3,4,5]; int[] arr2 = new int[arr.length]; for(int i = 0;i < arr.length;i++){ arr2[i] = arr[i]; }
2. 通过工具类 Arrays.copyOf()
- 拷贝数组
int[] arr = new int[]{1,2,3,4,5}; int[] arr2 = new int[5]; //两个参数: 要拷贝的数组 要拷贝的长度 arr2 = Arrays.copyOf(arr,arr.length);
- 拷贝数组的一部分
int[] arr = new int[]{1,2,3,4,5}; //左闭右开区间(不包括 4 下标)若后者超过arr的长度,超出部分全为零 int[] arr2 = Arrays.copyOfRange(arr,2,4);
3. 通过 System.arraycopy()
此方法是用native方法修饰的(是用c或c++代码实现的)速度快
int[] arr = new int[]{1,2,3,4,5}; int[] arr2 = new int[arr.length]; // 参数: 要拷贝的数组 拷贝的数组开始位置 目标数组 拷贝到数组的目标位置 要拷贝的长度 System.arraycopy(arr,0,arr2,0,arr.length);
4. 数组名 .clone()
原理:产生当前对象的一个副本
int[] arr = new int[]{1,2,3,4,5}; int[] arr2 = new int[5]; arr2 = arr.clone();
-
Java基础巩固(函数、函数的重载、数组、冒泡与选择排序、二分法查找、Array数组工具、二维数组)
2018-04-12 19:45:47一、函数: 函数(方法): 函数的作用: 提高功能代码的复用性。需求:做两个数的加法功能。目前存在的问题:以下的代码都是在做一个加法功能,而这里...函数的定义格式: 修饰符 返回值类型 函数名(形式参数..... -
【C】指针(四)指针怎么做函数参数
2018-05-23 20:50:42首先说下,怎么使用数组变量作为形参构建函数:定义这个函数时候,作为它的变量,只需要写明“数组名[]”即可,这种情况下,程序会自动为这个数组形参分配首地址,调用时候,直接调用数组名即可:这个程序实现了一个... -
黑马程序员_java的语言基础组成最终篇(对第四课函数和数组的总结)
2013-03-27 17:57:28android培训、java培训、期待与您交流! 通过今天对java语言基础组成中的函数和数组...形式:修饰符 返回值类型 函数名(参数的类型 形式参数1,参数的类型 形式参数2,,,,,,,,,) {执行语句; return 返回值(谁调 -
JS函数重载的解决方案
2020-12-12 03:54:52在JS的函数执行上下文中有一个名为arguments的有意思的变量,它以数组的形式存储了函数执行时传递过来的所有参数,即使函数定义没有定义这 么多个形参。还有一个特别之处就是跟Array类型相比,arguments变量有且... -
S1 : 函数
2014-09-09 15:58:00一、做为值的函数 例如,假设有一个对象数组...要解决这个问题,可以定义一个函数,它接收一个属性名,然后根据这个属性名来创建一个比较函数,下面就是这个函数的定义 function createComparisonFunction(prope... -
Python基础9—常用函数
2018-04-25 01:32:00①Lambda函数体只能有唯一的一条返回值表达式语句,语法为(参数个数可变): 返回函数名=lambda x,y,z:x+y+z ②可做为数组(也可以是字典或者列表)元素,哦那个人实现转表功能,也就是函数列表 定义... -
javascript函数的解释
2011-02-26 11:03:5235.字符串的定义:var myString = new String("This is lightsword"); 36.字符串转成大写:string.toUpperCase(); 字符串转成小写:string.toLowerCase(); 37.返回字符串2在字符串1中出现的位置:String1.indexOf(... -
可变参数、自动装箱与自动拆箱
2017-03-11 11:25:141、需求: 定义一个函数做加法功能(函数做几个数据的加法功能是不确定)。 方式一:函数重载,但是只要多一个参数就要重写一次方法,太麻烦。 方式二:数组 方式三:可变参数 2、可变参数的格式: 数据类型... -
jdk1.5新特性之可变参数
2016-12-16 15:47:22需求: 定义一个函数做加法功能(函数做几个数据 的加法功能是不确定)。 可变参数的格式: 数据类型... 变量名 可变参数要 注意的细节: 1. 如果一个函数 的形参使用上了可变参数之后,那么调用该方法的时候... -
苏嵌实训第四天
2020-07-08 21:20:27运算的方法,学习预编译,条件编译,编码规范,学习指针,数组的定义和初始化,数组名的作用,数组指针和指针数组以及main函数的参数,最后复习链表 本日任务完成情况 基本完成 本日任务遇到问题 宏函数与自定义... -
Java----可变参数
2017-01-19 16:36:44当我们定义一个函数做加法功能(函数做几个数据 的加法功能是不确定)。这个时候用可变参数是很方便的。 可变参数的格式: 数据类型... 变量名 可变参数要 注意的细节: 1. 如果一个函数 的形参使用上了可... -
jdk1.5新特性之------->可变参数
2017-02-10 16:34:00需求: 定义一个函数做加法功能(函数做几个数据 的加法功能是不确定)。 可变参数的格式: 数据类型... 变量名 可变参数要 注意的细节: 1. 如果一个函数 的形参使用上了可变参数之后,那么调用该... -
JDK1.5新特性-可变参数
2017-03-15 21:31:16需求:定义一个函数做加法功能。 可变参数的格式: 数据类型... 变量名 可变参数要注意的细节: 1.如果一个函数的形参使用上了可变参数之后,那么调用该方法的时候可以传递参数也可以不... -
你必须知道的495个C语言问题.[美]Steve Summit(带详细书签).pdf 压缩版
2018-04-08 02:26:50作为函数参数的指针 76 4.8 我有个函数,它应该接受并初始化一个指针:void f(int *ip){ static int dummy = 5; ip = &dummy;}但是当我如下调用时:int *ip; f(ip); 调用者的指针没有任何变化。 76 4.9 能否用... -
你必须知道的495个C语言问题(中文高清版)
2013-03-20 13:28:28作为函数参数的指针 4.8 我有个函数,它应该接受并初始化一个指针:voidf(int*ip){staticintdummy=5;ip=&dummy;}但是当我如下调用时:int*ip;f(ip);调用者的指针没有任何变化。 4.9 能否用void**通用指针作为... -
[你必须知道的495个C语言问题]人民邮电出版社
2012-08-18 19:02:28作为函数参数的指针 4.8 我有个函数,它应该接受并初始化一个指针:voidf(int*ip){staticintdummy=5;ip=&dummy;}但是当我如下调用时:int*ip;f(ip);调用者的指针没有任何变化。 4.9 能否用void**通用指针作为... -
你必须知道的495个C语言问题
2015-10-16 14:14:28作为函数参数的指针 4.8 我有个函数,它应该接受并初始化一个指针:voidf(int*ip){staticintdummy=5;ip=&dummy;}但是当我如下调用时:int*ip;f(ip);调用者的指针没有任何变化。 4.9 能否用void**通用指针作为参数... -
你必须知道的495个C语言问题.pdf
2013-01-20 14:30:54作为函数参数的指针 4.8 我有个函数,它应该接受并初始化一个指针:void f(int *ip){ static int dummy = 5; ip = &dummy;}但是当我如下调用时:int *ip; f(ip); 调用者的指针没有任何变化。 4.9 能否用void ** 通用... -
[你必须知道的495个C语言问题]人民邮电出版社.扫描版.pdf
2011-10-01 21:39:52作为函数参数的指针 4.8 我有个函数,它应该接受并初始化一个指针:void f(int *ip){ static int dummy = 5; ip = &dummy;}但是当我如下调用时:int *ip; f(ip); 调用者的指针没有任何变化。 4.9 能否用void ** 通用... -
《从新手到高手——C++全方位学习》.pdf【第一部分】
2011-06-23 16:12:139.2.3 通过引用来传递函数参数 123 9.2.4 让函数返回多个值 124 9.3 传递对象 127 9.3.1 用值来传递对象 127 9.3.2 使用指针来传递对象 129 9.3.3 使用const指针来传递对象 130 9.3.4 使用引用来传递对象 131 ... -
你必须知道的495个C语言问题(高清版)
2010-03-31 16:24:09作为函数参数的指针 47 4.8 我有个函数,它应该接受并初始化一个指针:void f(int *ip){ static int dummy = 5; ip = &dummy;}但是当我如下调用时:int *ip; f(ip); 调用者的指针没有任何变化。 47 4.9 能否用... -
《你必须知道的495个C语言问题》
2010-03-20 16:41:18作为函数参数的指针 47 4.8 我有个函数,它应该接受并初始化一个指针:void f(int *ip){ static int dummy = 5; ip = &dummy;}但是当我如下调用时:int *ip; f(ip); 调用者的指针没有任何变化。 47 4.9 能否用... -
jquery插件使用方法大全
2012-05-24 23:58:18可以用来添加不向外部公开的方法,或者对jQuery的某些方法进行重新定义以提供新功能,或者提供更好的封装、避免名称空间冲突。当然,也可以用来开发插件,但Resig强烈建议在开发插件之前,先考虑jQuery UI widget... -
零起点学通C++多媒体范例教学代码
2010-11-30 09:35:1314.5 数组名与函数 14.6 传递与接收 14.7 数组与函数 14.7.1 函数传参实例一——求数组所有元素的和 14.7.2 函数传参实例二——用递增法查找数据 14.7.3 函数传参实例三——用二分算法查找数据 14.7.4 函数传参实例...
-
Pytorch问题---The size of tensor a (4) must match the size of tensor b (3) at non-singletonThe size of
-
php 查找php配置文件php.ini所在路径的二种方法
-
FPS游戏逆向-UE4虚幻四游戏逆向
-
python—从单链表中移除重复项
-
洛谷P1307 [NOIP2011 普及组] 数字反转经典解法
-
结合使用电纺丝和微成型来调节雪旺氏细胞行为,制备取向聚己内酯支架
-
FyreString:FyreString是PHP的免费开源字符串实用程序库-源码
-
将和声搜索算法与杜鹃搜索混合,以进行全局数值优化
-
文本分析项目-源码
-
程序员必修基础套餐课
-
iptables 企业级防火墙配置(四表五链)
-
2015年下半年 嵌入式系统设计师 上午试卷 综合知识 软考真题【含答案和答案解析】
-
AttributeError: ‘PyQt5.QtCore.pyqtSignal‘ object has no attribute ‘connect‘
-
ApacheFlink漫谈系列-概述
-
朱老师C++课程第3部分-3.6智能指针与STL查漏补缺
-
UL 153:2020 Portable Electric Luminaires(便携灯具)- 最新完整英文版(204页)
-
Kubernetes下日志采集、存储与处理技术实践
-
在 Linux 上构建企业级 DNS 域名解析服务
-
python—找出单链表中倒数第K个元素
-
洛谷P5725 【深基4.习8】求三角形经典解法