如果我们通过函数的参数将一个数组传递到参数中去,那么在函数里接收到的是什么东西呢?我们知道如果传递一个普通变量,那么参数接收到的是值,如果传递一个指针变量,参数接收到的也是值,只不过这时的值是地址。那么数组是什么?将数组作为值传给一个函数,在函数的参数里有一个数组变量来接收这个数组,看下到底接收到数组变量的什么东西呢?以minmax作为例子来测试下:

  在minmax函数中能不能计算出数组a的个数?在minmax和main中分别添加printf函数,从结果可以看出,在main里a的大小是68,而在minmax函数中数组a的大小为8,8是什么,在64位机器下,8刚好和一个指针的大小是一样的,和地址的大小是一样的。

 #include <stdio.h>
void minmax(int a[],int len,int *max,int *min); int main(void) {
int a[]={,,,,,,,,,,,,,,,,};
int min,max;
printf("main sizeofa[]= %lu\n",sizeof(a)); //sizeof a in main
minmax(a,sizeof(a)/sizeof(a[]),&min,&max);
printf("min=%d,max=%d\n",min,max);
return ;
} void minmax(int a[],int len,int *min,int *max){
int i;
printf("minmax sizeofa[]= %lu\n",sizeof(a)); //sizeof a in minmax
*min =*max=a[];
for(i=;i<len;i++){
if(a[i]<*min){
*min=a[i];
}
if(a[i]>*max){
*max=a[i];
}
}
}

  然后再看下a在main和minmax中的地址分别是多少,结果地址是一样的,这说明什么,说明在minmax里的这个数组就是main里的这个数组,他们是同一个。再比如在minmax中修改a[0]的值,然后在main中调用完minmax函数后输出a[0]的值,发现确实结果确实改变了。

  minmax参数中int a[]就是指针,那么这个参数为什么必须留一个空的方括号,为什么在方括号里写数字也没用,为什么在minmax中sizeof没有办法得到这个数组元素的个数,原因就在于它其实就是个指针,它只是样子看上去像一个数组,那么既然它实际上是一个指针,我们把它写成像一个指针行不行,a[]写成*a,发现编辑和运行结果都没有变化。所以我们可以说数组和指针存在某种联系:函数参数中的数组实际上是指针,也就是说sizeof(a)= siziof(int*),但是对于这种指针可以使用数组的方括号[]运算符来进行运算。所以说下列四种函数的原型是等价的,不是说他们类型等价,而是说作为函数参数表中出现它们是等价的,作为函数原型他们是等价的。

 int sum(int *a,int n);
int sum(int *,int);
int sum(int a[],int n);
int sum(int [],int);

数组名本身表达的是地址,可以当作指针使用

  实际上,数组变量是特殊的指针,因为数组变量本身就表达地址,在取地址符&时实验过,直接拿数组的名字就可以得到数组的地址,数组名字本身表达的就是地址,因此int a[10];int *p=a,不需要使用取地址符&,但是数组的每一个元素表达的是单个变量,比如a[0],a[1]就是单个变量,所以对单个的元素取地址是需要用&符号的,a==&a[0]这件事情在取地址时看到过了。

  []这个运算符可以对数组做,也可以对指针做,p[0]相当于*p,做实验测试,在minmax代码的main函数中添加如下代码,输出结果显示*p=p[0]。

     int *p =&min;
printf("*p=%d\n",*p);
printf("p[0]=%d\n",p[]);

  p[0]什么意思,就是我以为p所指的地方是个数组的话,p[0]是数组p的第一个元素。那么实际上我们并没有数组,有的是一个叫做min的变量,min里存放的是2,p指向min,那么*p是所指变量的值,p[0]是把p所指的地方当作是一块数组,现在它不是一个数组只是一个变量,你可以把它当作一个数组看,当作int min[1]来看,作为min[1]来看的话,它有效的数组是什么?min[0].当然对于普通的变量不可以这么写,但是对于指针变量就可以这么写了,也就是它所指的地方的第一个元素取出来作为p[0].

  同样的,*运算符我们知道是对指针做的,是取出指针所指的地方的值,也可以对数组做。如果有数组也可以说*a=25,我们试验下这件事情,结果是*a为1120,可见*a可读可写,总之可以当成指针用。

  数组变量是const指针,在之前讲数组时说到过,如果定义两个数组,int a[],int b[],使b=a是不可以的,数组之间是不能赋值的。那么传递时如果int *q=a,这个是可以的,一个不可以一个可以有什么区别那?实际上我们说的int b[]可以被看作int * const b,const意思是b是常量,不可以改变,它是这个数组就不可以是别的数组了,所以数组是一个常量指针,不可以赋值,不可以代表别的东西了。

听翁恺老师mooc笔记(5)--指针与数组的更多相关文章

  1. 听翁恺老师mooc笔记(6)--指针运算

    指针值加1就是将指针值加上sizeof(指针所指变量的类型) 1+1=2,那么指针加1是加上了1这个数字吗?试一下,在代码中定义了char数组,char也是整数,数组名是ac,ac中有10个元素,0- ...

  2. 听翁恺老师mooc笔记(10)--结构

    定义结构: 在程序里,如果想要表达一个数据就需要一个变量,而每个变量又都需要一个类型,之前学过C语言中有int.double.float.char等这些基础类型,还有指针.数组等.如果你要表达的数据比 ...

  3. 听翁恺老师mooc笔记(7)--字符串1

    C语言中字符串的定义 如果定义一个字符数组word,并使用大括号对其初始化,如下图所示: 但是这个不是C语言的字符串,只是字符数组,不是字符串,因为不能使用字符串的方式进行计算.那么C语言的字符串长什 ...

  4. 听翁恺老师mooc笔记(4)--指针的应用场景

    指针应用场景一:交换两个变量的值 在学习函数时,交换两个数的值,做一个swap函数,传递值进去,也可以将两个值交换过来,没问题,可是离开swap就没有用了,为什么?因为传进去的是两个值. #inclu ...

  5. 听翁恺老师mooc笔记(3)--指针的定义

    在上一个blog学习了&运算符,使用&取了变量.数组等地址,有什么用那?如果能够将取得的变量的地址传递给函数,能否通过这个地址在函数内访问到外部这个变量?答案是肯定的,scanf(&q ...

  6. 听翁恺老师mooc笔记(16)--程序设计与C语言

    问题1:计算机遍布生活的各个方面,若你需要一个功能可以下载APP,我们需要的大部分功能都可以找到对应的APP,如果没有可以自己写一个软件,但是很少人需要这么做,那么我们为什么学习计算机编程语言? 学习 ...

  7. 听翁恺老师mooc笔记(12)--结构中的结构

    结构数组: 和C语言中的int,double一样,一旦我们做出一个结构类型,就可以定义这个结构类型的变量,也可以定义这个结构类型的数组.比如下面这个例子: struct date dates[100] ...

  8. 听翁恺老师mooc笔记(11)--结构和函数

    结构作为函数参数: 声明了一个结构就有了一种自定义的数据类型,这个数据类型和int.float.double一样,int等基本类型可以作为函数的参数,那么这种个自定义的结构类型也应该可以作为函数参数, ...

  9. 听翁恺老师mooc笔记(8)--字符串2

    字符串的赋值 字符串的输入与输出 对C语言的基础类型,比如int.double等类型,scanf.printf有专门的格式转换,而对字符串,scanf.printf使用%s格式字符进行输入与输出.当使 ...

随机推荐

  1. java 单例模式-饿懒汉模式

    单例-饿汉模式 1.将构造方法私有化,不允许外部直接创建对象 private Singleton(){}2.自己在类的内部创建一个唯一实例 private static Singleton insta ...

  2. Javascript设计模式(1)

    本文是学习了<JavaScript设计模式>(谢廷晟 译)做的学习笔记 一.JavaScript的灵活性 1. 普通 functon function startAnimation() { ...

  3. [CF932E]Team Work & [BZOJ5093]图的价值

    CF题面 题意:求\(\sum_{i=0}^{n}\binom{n}{i}i^k\) \(n\le10^9,k\le5000\) 模\(10^9+7\) BZOJ题面 题意:求\(n*2^{\frac ...

  4. [BZOJ1006] [HNOI2008] 神奇的国度 (弦图)

    Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的.为了巩固三角关系,K国禁止四边关系,五边关系 ...

  5. Java数组的操作方法

    在JDKAPI中,我们可以看到java.util.Arrays类.因为是在util工具包下.所以,方法都是静态的 看看里面有哪些方法是我们平时工作中会使用到的(以 int[] 举例)? 1)binar ...

  6. mysql的conv的用法

    这次的ctf比赛用到这个函数,这里记录一下 题目禁了ascii , ord 那就使用conv 这个函数是用来将字符转换进制的,例如将a转成ASCII码(换个说法就是将16进制的a换成10进制) 那就直 ...

  7. 软件License认证方案的设计思路

    销售license是商业软件的贯用商业模式.用户向商家购买软件安装盘搭载license许可,才可以使用该软件.我们作为软件开发者,为了保护自身的权益,在软件开发过程中也不可避免的会设计license管 ...

  8. Net 面试随想

    佳节已去,至今已半月有余,近来园中唱衰net的声音幽幽而起,net不成熟的大环境一直被作为诟病,net core的跨平台去年抄的火热,是否为net 崛起的最后一根稻草,结合我面试的情况,作为小白,嘟囔 ...

  9. sharepoint 2013实践

    之前在一篇文章中说过了SharePoint环境的安装.那么如何使用SharePoint开发一个站点呢?这就是本篇所要阐述的问题. 在如何具体操作之前,我们先来普及下SharePoint基础知识.Far ...

  10. 无需安装Oracle Client连接Oracle数据库

    介绍 当我们采用 ODP.NET 检索Oracle 数据库的时候,Oracle客户端是必须安装.假如当时电脑上没有安装Oracle客户端,就不能这么用了,这时候Oracle.ManagedDataAc ...