0


【C语言指针与二维数组传参】

指针与二维数组传参

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

指针的误区与进阶


前言

什么是指针?

指针是地址的另外一种表达形式,那为什么要叫做指针呢?我的理解是这样:当我们已经有了地址的时候,需要一个动作来定位这个地址,我们把这个动作记为指向,而针表示箭头的方向。接下来我们要开始正文。


提示:以下是本篇文章正文内容,下面案例可供参考

一、指针的错误

打代码的时候需要规避的
1.野指针:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
2.空指针:(NULL)对空指针间接访问会报错
3.有的时候我们已经用其进行传参,但是没有发挥作用,甚至警告!(自己编的名,哈哈)

二、示范

1.普通的利用函数交换两个数值可能有过这样的情况

代码如下(示例):

include <stdio.h>intmain(){int a=3,b=5;swap(a,b);printf(“max=%d,min=%d\n”,a,b);return0;}voidswap(int x,int y)//这时候的x,y为形参,函数返回后自动销毁{int temp;//并不能够实现交换数值
   temp=x;  x=y;   y=temp;}

这时候我们需要利用指针进行传址以地址的形式进行访问:

voidswap(int *p1,int *p2){ int temp;
   temp=*p1;*p1=*p2;*p2=temp;}
int main(){
  int a=3,b=5;if(a<b)swap(&a,&b);printf(“max=%d,min=%d\n”,a,b);// 5 3return0;}

2.下面展示一下错误

代码如下(注意一下与上面的区别):

voidswap(int*p1,int*p2){int* temp;//这里定义成了一个指针,但是没有指向的整形变量*temp=*p1;//因此这里无法进行赋值     *p1=*p2;*p2=*temp;}intmain(){int a=3,b=5;if(a<b)swap(&a,&b);printf(“max=%d,min=%d\n”,a,b);// 5 3return0;}

当然,如果我们将它改为:

voidswap(int *p1,int *p2){ int * temp=NULL;//上述提到过,空指针会报错,不能这样定义*temp=*p1;*p1=*p2;*p2=*temp;}
int main(){
  int a=3,b=5;if(a<b)swap(&a,&b);printf(“max=%d,min=%d\n”,a,b);// 5 3return0;}

也可以这么理解:temp初始化为一个确定的值,当进行下一次赋值的时候,相当于将p1这个值赋给了temp,我们知道,确定的值只能赋值给不确定的变量,而它却将一个确定的值p1赋值给了NULL,这显然是不成立的。

三. 二维数组与指针的关系与易错

1 二维数组传参的三种方式:

 int a[m][n]
  int a[][n] 
  int(*a)[n]//二维数组对应数组指针,下面会用到

首先看一下第一个与第二个的区别,m是可有可无的,故我们将注意力转到n上面,当我们想输入一个二维数组首先要知道他的行与列,而n对应的参数应不小于我们输入的变量,例如:当输入n=100时,传参所对应的参数a[][n]中的n应该为大于等于100的常数,否则会出现遗漏,导致传进的参数不是二微元素的所有变量,与野指针有异曲同工之妙

2 二位数组传参所理解的歧义:

 当我们介绍完二维数组的三种传参方式之后,我们知道,类比一维数组,传参的时
 候,可以这样:
  代码如下:
#include<stdio.h>voidswap(int* p){*p =0;}
int main(){
    int a =5;swap(&a);printf("%d", a);//0return0;}

这里用到了指针中常见的符号,我们称之为解引用符号,这里不得不提到我当时犯下的错误,当时我认为一个一维数组arr[]传参,arr代表取出首元素的地址,那么当我进行二维数组app[][]传参时,可不可以这样传 app(这里暂时不当成二级指针,由于后面星号打不出来,我将用-代替)就是将-(-app)括号里面的对比一维数组可以联想到是取出首行元素的地址,也就是说,把(-app)看做一个一维数组,还能-出他的首元素地址(呜呜呜,看起来没什么问题,但这样就错了呀)
上图:在这里插入图片描述
后来才知道,是因为
已经被二级指针所占用,或许是因为二级指针的思维比这样的思维优先吧(说来惭愧,呜呜呜)。


总结

主要说明了传地址的问题与一些自己经历的一些有关二维数组传地址的错误,前人踩过的后人不必再踩,本着这样的初心,我将继续改进,希望能对小伙伴们有所帮助(也是为了自己记笔记哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈(此处省略一万字)…)

标签: c语言

本文转载自: https://blog.csdn.net/NEFUT/article/details/123633867
版权归原作者 Fighting阳! 所有, 如有侵权,请联系我们删除。

“【C语言指针与二维数组传参】”的评论:

还没有评论