zoukankan      html  css  js  c++  java
  • 听翁恺老师mooc笔记(5)--指针与数组

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

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

     1 #include <stdio.h>
     2 void minmax(int a[],int len,int *max,int *min);
     3 
     4 int main(void) {
     5     int a[]={1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55};
     6     int min,max; 
     7     printf("main sizeofa[]= %lu
    ",sizeof(a));     //sizeof a in main
     8     minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);
     9     printf("min=%d,max=%d
    ",min,max);
    10     return 0;
    11 }
    12 
    13 void minmax(int a[],int len,int *min,int *max){
    14     int i;
    15     printf("minmax sizeofa[]= %lu
    ",sizeof(a));       //sizeof a in minmax
    16     *min =*max=a[0];
    17     for(i=1;i<len;i++){
    18         if(a[i]<*min){
    19             *min=a[i];
    20         }
    21         if(a[i]>*max){
    22             *max=a[i];
    23         }
    24     }
    25 }
    View Code

     

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

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

    1 int sum(int *a,int n);
    2 int sum(int *,int);
    3 int sum(int a[],int n);
    4 int sum(int [],int);
    View Code

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

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

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

    1     int *p =&min;
    2     printf("*p=%d
    ",*p);
    3     printf("p[0]=%d
    ",p[0]);
    View Code

      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是常量,不可以改变,它是这个数组就不可以是别的数组了,所以数组是一个常量指针,不可以赋值,不可以代表别的东西了。

  • 相关阅读:
    「SDOI2014」向量集 解题报告
    HNOI 2014 世界树
    LOJ #2205. 「HNOI2014」画框 解题报告
    KM模板
    洛谷 [HNOI2014]道路堵塞 解题报告
    [AHOI2014/JSOI2014] 解题报告
    AndroidStudio中添加依赖的三种方式以及如何引入so文件和arr文件
    android 四大组件详解
    Android—— ListView 的简单用法及定制ListView界面
    Android Studio 使用VCS版本控制
  • 原文地址:https://www.cnblogs.com/c-programing-language/p/6444092.html
Copyright © 2011-2022 走看看