如果我们通过函数的参数将一个数组传递到参数中去,那么在函数里接收到的是什么东西呢?我们知道如果传递一个普通变量,那么参数接收到的是值,如果传递一个指针变量,参数接收到的也是值,只不过这时的值是地址。那么数组是什么?将数组作为值传给一个函数,在函数的参数里有一个数组变量来接收这个数组,看下到底接收到数组变量的什么东西呢?以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. pat1111-1120

    1111 比较麻烦的最短路 #include<cmath> #include<map> #include<iostream> #include<cstring ...

  2. 物联网框架ServerSuperIO在.NetCore实现跨平台的实践路线

    正所谓天下大势,不跟风不行.你不跨平台,很low嘛.java说:你们能跨嘛,跨给我看看.C#说:不要强人所难嘛.java说:能部署在云上吗?docker?微服务?C#说:不要强人所难嘛.java说:你 ...

  3. Python Web-第二周-正则表达式(Using Python to Access Web Data)

    0.课程地址与说明 1.课程地址:https://www.coursera.org/learn/python-network-data/home/welcome 2.课程全名:Using Python ...

  4. RobotFramework下的http接口自动化Set Request Body 关键字的使用

    Set Request Body关键字用来设置http 请求时的body 信息,尤其是在post 请求时,经常需要用到这个关键字. 该关键字接收一个参数,[ body ] 示例1:登录博客园(http ...

  5. 【Luogu1345】周游加拿大(动态规划)

    [Luogu1345]周游加拿大(动态规划) 题面 题目描述 你赢得了一场航空公司举办的比赛,奖品是一张加拿大环游机票.旅行在这家航空公司开放的最西边的城市开始,然后一直自西向东旅行,直到你到达最东边 ...

  6. telnet命令使用详解

    telnet命令用于登录远程主机,对远程主机进行管理.telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了.但仍然有很多别的系统可能采 ...

  7. 前端综合学习笔记---异步、ES6/7、Module、Promise同步 vs 异步

    同步 vs 异步 先看下面的 demo,根据程序阅读起来表达的意思,应该是先打印100,1秒钟之后打印200,最后打印300.但是实际运行根本不是那么回事 console.log(100) setTi ...

  8. wcf类库及宿主

    说起wcf,一直以来总是直接创建wpf的应用程序,这样默认的宿主是IIS.如果想更换宿主,那么我们首先得创建wcf类库. 这个类库会自动创建一个app.config文件.到最后部署的时候,把它移到宿主 ...

  9. 18.CSS

    选择器 1.标签上直接设置style属性 <p style="color: red">直接标签里面写</p> 2.id选择器 <style> # ...

  10. Java中常见数据结构List之LinkedList

    二,LinkedList 1, linkedList底层数据结构 linkedList底层是一个双向链表 2,LinkedList和ArrayList的对比 1.顺序插入速度ArrayList会比较快 ...