二维数组传参,用int指针接收
二维数组传参,用int*接收
前言
//我们直到二维数组的数组名是一个地址,等于arr[0][0],即通过值来看,arr=&arr[0][0]
//而下方的Print函数调用,传递的参数却是&arr[0][0],疑问来了,直接传数组名可以吗?(一维数组可以)
#include<stdio.h>
void Print(int* arr) {for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {printf("%d ", *(arr + i * 10 + j));}}
}
int main(void)
{int arr[10][10];int n = 0;for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {arr[i][j] = ++n;}}Print(&arr[0][0]); //注意传参方式return 0;
}
原因
- 通过下面的代码来解剖二维数组名和取地址首元素的区别
//现来通过以下代码解剖arr和&arr[0][0]
#include<stdio.h>
int main(void)
{int arr[10][10];printf("arr的值为: %d\n", arr); //十进制输出,方便观察printf("&arr[0][0]的值为:%d\n", &arr[0][0]);printf("-----------------------------------------------\n");printf("arr+1的值为: %d\n", arr+1);printf("&arr[0][0]+1的值为:%d\n", &arr[0][0]+1);return 0;
}
//输出结果:
//arr的值为: 8190080
//&arr[0][0]的值为:8190080
//-----------------------------------------------
//arr+1的值为: 8190120
//&arr[0][0]+1的值为:8190084//可以看出arr和&arr[0][0]的值确实一致
//但各自+1的值却大不相同,arr+1多了40,&arr[0][0]+1多了4,其实和指针步长有关
二维数组名arr不用说肯定是一个指针,我们知道一维数组名是一个指向首元素的指针,我们是通过指针步长来判断的(即:指针进行+1所跳过的字节数)那么二维数组名的步长是多少呢?
通过上方的输出可以看出,arr数组的数组名步长为40,取首元素的地址步长为4,这其实和其各种的类型有关
// &arr[0][0]类型为 int* // arr 类型为 int(*)[10]
自此我们可以得知,要想遍历数组,每次+1只能走4个字节即步长为4,如果非要用数组名传参可以这样
Print((int*)arr);
如有错误或遗漏,欢迎指出!
二维数组传参,用int指针接收相关推荐
- 【概念辨析】二维数组传参的几种可能性
一.二维数组传参竟然不是用二级指针进行接收? 今天进行再一次的二级指针学习时,发现了一条以前没怎么注意过的知识点:二维数组进行传参只能用二维数组(不能省略列)进行接收或者是数组指针. ...
- 二维数组传参||传值
先给出问题: 像下面这样的数组,在函数中如何传参?也就是说如何保证虚参与实参类型一致. char str_arr[3][10] = {"yes","no",&q ...
- 什么是二维数组以及二维数组传参
什么是二维数组 当刚看见二维数组时肯定会对二维数组有一些疑惑二维数组是什么? int arr[4] = { 1,2,3,4 };//这个便是一维数组 以 int 类型为例子当 int 类型的元素集合在 ...
- 多维数组之二维数组传参、返回值、申请内存问题
目录 多维数组 存储顺序 二维数组基础知识 数组名 下标 指向数组的指针 二维数组使用 初始化 作为函数参数的二维数组 二维数组返回值与申请内存问题 多维数组 如果某个数组的维数不止1个,它就被称为多 ...
- c语言字符二维数组传参,C语言函数传递二维数组
C语言如果给函数传递二维数组作为参数 问题的产生 先看一个传递二维数组的例子: #include void foo(int a[][], int m, int n) { int i = 1; int ...
- 关于二维数组传参做形参
二维数组的存储方式是和一维数组没什么区别,但是用二维数组做参数,它的形参该怎样写?要注意的是:函数中的形参其实就相当于一个声明,并不产生内存分配,形参的目的就是要让编译器知道函数参数的数据类型. 正确 ...
- 如何把二维数组传参给函数
1.传递"数组指针" #include <stdio.h>void output( int (*pa)[3], int n ) //这个函数只能输出n行3列的二维数组 ...
- 漏刻有时API接口实战开发系列(13):小鹅通云服务PHP-API二维数组传参解决方案
在使用小鹅通云服务API开发过程中,当传递二维数组时,后台总是提示The user id list must be an array.即传递的参数必须是数组. 文档请求标准格式 {"acce ...
- C语言指针怎么存二维数组,C语言怎么用指针代替二维数组
1.设p是指向二维数组a[m][n]的指针变量,则有:int*p=a[0];//此时P是指向一维数组的指针.P++后,p指向a[0][1].2.如果定义int(*p1)[n];p1=a;p1++后,p ...
- 二级(多级)指针,二级指针和二维数组的避坑,指针面试考题
1.二级指针的的认识 2.二级指针的实战 想获得二维数组的某个人的位置,采用的是return的方式 如果把第三行的int * 换成void ,把ppos换成传参的方式做. 结果崩溃了 原因是 是个野指 ...
最新文章
- mysql开启function,Mysql自定義函數(function)
- html视频怎么自动全屏播放,网页中用标签播放视频,可以全屏播放的代码肿么写?...
- 蓝桥杯练习系统习题-基础训练2
- 图片自动播放和动态添加
- Apache基金会接收阿里RocketMQ为孵化项目
- C++利用栈实现计算器
- 美国知名DJ 3LAU以1160万美元出售全球首套音乐专辑NFT藏品
- 基于启英泰伦语音芯片的语音AIoT应用方案,可实现家居联控
- 电子计算机扫描仪系统,人体三维扫描仪
- shopex php5.3 无法安装,php版本导致shopex4.8.5安装的问题
- 苹果手机为什么Apple ID会被停用
- mysql端口establish_sqlserver提示The Network Adapter could not establish the con
- centos配置虚拟主机(站点)
- 路遥《早晨从中午开始》读后感
- JavaScript中用数组实现键值对
- 云主机装黑果实践(6):处理云主机上变色龙启动后置过程:驱动和黑屏
- 牛逼的人,都不太要面子
- Scrcpy手机投屏
- 历代Android开机动画,回顾Windows历代版本开机画面:XP最经典
- 格式化的盘要如何恢复文件