二维数组传参,用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指针接收相关推荐

  1. 【概念辨析】二维数组传参的几种可能性

    一.二维数组传参竟然不是用二级指针进行接收? 今天进行再一次的二级指针学习时,发现了一条以前没怎么注意过的知识点:二维数组进行传参只能用二维数组(不能省略列)进行接收或者是数组指针.         ...

  2. 二维数组传参||传值

    先给出问题: 像下面这样的数组,在函数中如何传参?也就是说如何保证虚参与实参类型一致. char str_arr[3][10] = {"yes","no",&q ...

  3. 什么是二维数组以及二维数组传参

    什么是二维数组 当刚看见二维数组时肯定会对二维数组有一些疑惑二维数组是什么? int arr[4] = { 1,2,3,4 };//这个便是一维数组 以 int 类型为例子当 int 类型的元素集合在 ...

  4. 多维数组之二维数组传参、返回值、申请内存问题

    目录 多维数组 存储顺序 二维数组基础知识 数组名 下标 指向数组的指针 二维数组使用 初始化 作为函数参数的二维数组 二维数组返回值与申请内存问题 多维数组 如果某个数组的维数不止1个,它就被称为多 ...

  5. c语言字符二维数组传参,C语言函数传递二维数组

    C语言如果给函数传递二维数组作为参数 问题的产生 先看一个传递二维数组的例子: #include void foo(int a[][], int m, int n) { int i = 1; int ...

  6. 关于二维数组传参做形参

    二维数组的存储方式是和一维数组没什么区别,但是用二维数组做参数,它的形参该怎样写?要注意的是:函数中的形参其实就相当于一个声明,并不产生内存分配,形参的目的就是要让编译器知道函数参数的数据类型. 正确 ...

  7. 如何把二维数组传参给函数

    1.传递"数组指针" #include <stdio.h>void output( int (*pa)[3], int n ) //这个函数只能输出n行3列的二维数组 ...

  8. 漏刻有时API接口实战开发系列(13):小鹅通云服务PHP-API二维数组传参解决方案

    在使用小鹅通云服务API开发过程中,当传递二维数组时,后台总是提示The user id list must be an array.即传递的参数必须是数组. 文档请求标准格式 {"acce ...

  9. 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 ...

  10. 二级(多级)指针,二级指针和二维数组的避坑,指针面试考题

    1.二级指针的的认识 2.二级指针的实战 想获得二维数组的某个人的位置,采用的是return的方式 如果把第三行的int * 换成void ,把ppos换成传参的方式做. 结果崩溃了 原因是 是个野指 ...

最新文章

  1. mysql开启function,Mysql自定義函數(function)
  2. html视频怎么自动全屏播放,网页中用标签播放视频,可以全屏播放的代码肿么写?...
  3. 蓝桥杯练习系统习题-基础训练2
  4. 图片自动播放和动态添加
  5. Apache基金会接收阿里RocketMQ为孵化项目
  6. C++利用栈实现计算器
  7. 美国知名DJ 3LAU以1160万美元出售全球首套音乐专辑NFT藏品
  8. 基于启英泰伦语音芯片的语音AIoT应用方案,可实现家居联控
  9. 电子计算机扫描仪系统,人体三维扫描仪
  10. shopex php5.3 无法安装,php版本导致shopex4.8.5安装的问题
  11. 苹果手机为什么Apple ID会被停用
  12. mysql端口establish_sqlserver提示The Network Adapter could not establish the con
  13. centos配置虚拟主机(站点)
  14. 路遥《早晨从中午开始》读后感
  15. JavaScript中用数组实现键值对
  16. 云主机装黑果实践(6):处理云主机上变色龙启动后置过程:驱动和黑屏
  17. 牛逼的人,都不太要面子
  18. Scrcpy手机投屏
  19. 历代Android开机动画,回顾Windows历代版本开机画面:XP最经典
  20. 格式化的盘要如何恢复文件

热门文章

  1. 使用多线程爬取笔趣阁
  2. 四川绵阳动感地带学生套餐资费备忘
  3. C51单片机控制蜂鸣器
  4. vbs自动登陆115网盘代码
  5. Excel - Office Excel 多表无法多窗口问题
  6. c语言 组合问题,c语言排列组合问题
  7. java 组合问题_java数组排列组合问题汇总
  8. c语言编写排列组合程序,C语言实现排列组合
  9. linux鼠标手势软件,在Deepin Linux系统使用Easystroke鼠标手势会更方便工作
  10. 探索智慧医院落地新方案!OFweek 2019医疗物联网大会成功举办