传入函数的数组成了什么?

· 当我们向一段函数传入数组变量,参数接收到的是值,如果我们传入指针时,参数接收到的是也是值(一个地址);
· 如果传入函数的是一个普通变量,它接收到的是一个值
· 如果传入函数的是一个指针,它接收到的也是一个值(地址)
· 如果传入的是一个数组,它接收到的是什么?

我们来看个例子

#include <stdio.h> void minmax(int a[], int len, int *min, int *max); int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55,};int min,max; minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);printf("min=%d,max=%d\n",min,max);return 0;
}
void minmax(int a[], int len, int *min, int *max)
{int i;*min = *max =a[0]; for (i=1;i<len;i++){ if(a[i]<*min){ *min =a[i]; }if(a[i]>*max){*max =a[i]; }}
}

分别在main函数和minmax函数里打印出sizeof(a)的大小

#include <stdio.h>
/*
取出一组数组里的最小的和最大的值
*/
void minmax(int a[], int len, int *min, int *max); int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55,};int min,max;/*[Error] cannot convert 'const char*' to 'int*' for argument '1' to 'void minmax(int*, int, int*, int*)'*/ minmax("main sizeof(a)=%lu\n",sizeof(a)); // main调用之前再看下minmax的大小 minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);printf("min=%d,max=%d\n",min,max);return 0;
}
void minmax(int a[], int len, int *min, int *max)
{int i;printf("minmax sizeof(a)=%lu\n",sizeof(a)); //输入minmax的大小 *min = *max =a[0]; for (i=1;i<len;i++){ if(a[i]<*min){ *min =a[i]; }if(a[i]>*max){*max =a[i]; }}
}

main函数里,

sizeof(a)=68

minmax函数里,

sizeof(a)=4

注意:我的编译器这里会报错,而老师的只是一个警告([Error] cannot convert 'const char’ to ‘int*’ for argument ‘1’ to ‘void minmax(int*, int, int*, int*)’)*
无法将参数’1’的’const char’转换为’int*‘传入’void minmax(int*, int, int*, int*)’*

看到警告或者报错后,我们再试一段代码

#include <stdio.h>
/*
取出一组数组里的最小的和最大的值
*/
void minmax(int a[], int len, int *min, int *max); int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55,};int min,max;printf("main   a=%p\n",a);minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);printf("min=%d,max=%d\n",min,max);return 0;
}
void minmax(int a[], int len, int *min, int *max)
{int i;printf("minmax a=%p\n",a); *min = *max =a[0]; for (i=1;i<len;i++){ if(a[i]<*min){ *min =a[i]; }if(a[i]>*max){*max =a[i]; }}
}

运行结果

main a=0062FE44
minmax a=0062FE44

将查看a的大小语句改为查看a的指针地址,两个值获取是一样的
问题来了
从这里可以看出maina[]其实就是minmax里的a[]

在这里我们再将minmax函数里的a[0]=1000来看看结果,再回到main里时,它会发生怎样的改变

#include <stdio.h>
#include <stdio.h>
/*
取出一组数组里的最小的和最大的值
*/
void minmax(int a[], int len, int *min, int *max); int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55,};int min,max;printf("main   a=%p\n",a);minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);printf("a[0]=%d\n",a[0]); //执行main后我们查看a[0]等于多少 printf("min=%d,max=%d\n",min,max);return 0;
}
void minmax(int a[], int len, int *min, int *max)
{int i;printf("minmax a=%p\n",a); a[0]=1000;*min = *max =a[0]; for (i=1;i<len;i++){ if(a[i]<*min){ *min =a[i]; }if(a[i]>*max){*max =a[i]; }}
}

main a=0062FE44
minmax a=0062FE44
a[0]=1000
min=2,max=1000

从这里可以看出来a[]它就是一个指针
刚才报错 main函数里获取sizeof(a)的个数,原因是因为a[]它是一个指针
现在我们将两个函数的a[]全部改为*a, 看看编译是否会通过

传入函数的数组成了什么?

· 函数参数表中的数组实际上就是指针
· sizeof(a) ==sizeof(int
)
· 但是可以用数组的运算符[]进行运算
*

数组参数

· 以下四种函数原型是等价的:
· int sum(int *ar,int n);
· int sum(int *,int);
· int sum(int ar[], int n);
· int sum(int[], int);

数组变量是特殊的指针

**· 数据变量本身表达地址,所以
· int a[10];int *p =a; //无需用 &取地址
· 但是数组的单元表达的是单个变量,对单个需要用&取地址
· a == &a[0]
· []运算符可以对数组做,也可以对指针做:
· p[0]=*p
· 运算符可以对指针做,也可以对数组做:
·
a = 25
· 数组变量是 const的指针,所以不能被赋值,两个数组之前不能互相赋值
· int[a] <==> int * const a=…

#include <stdio.h>
/*
取出一组数组里的最小的和最大的值
*/
void minmax(int *a, int len, int *min, int *max); int main(void)
{int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,55,};int min,max;printf("main   a=%p\n",a);minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);printf("a[0]=%d\n",a[0]); //执行main后我们查看a[0]等于多少 printf("min=%d,max=%d\n",min,max);/* 验证p[0]=*p */int *p= &min; printf("  *p=%d\n", *p);printf("p[0]=%d\n", p[0]);/* 验证*a=a[0]*/printf("*a=%d\n",*a); return 0;
}
void minmax(int *a, int len, int *min, int *max)
{int i;printf("minmax a=%p\n",a); a[0]= 1000;*min = *max =a[0]; for (i=1;i<len;i++){ if(a[i]<*min){ *min =a[i]; }if(a[i]>*max){*max =a[i]; }}
}

执行结果

main a=0062FE40
minmax a=0062FE40
a[0]=1
min=1,max=55
*p=1
p[0]=1

翁恺老师C语言学习笔记(十)指针_指针与数组相关推荐

  1. 翁恺老师C语言学习笔记(十)指针_指针的使用

    指针的应用场景一 · 交换两个变量的值 void swap(int *pa, int *pb);//定义指针*pa和*pb int main(void) {int a = 5; int b = 6;s ...

  2. 翁恺老师C语言学习笔记(十)指针_指针变量就是记录地址的变量

    指针变量就是记录地址的变量 scanf函数 · 如果能够将取得的变量的地址传递给一个函数,能否通过这个地址在那个函数内访问这个变量 · scanf("%d", &i) · ...

  3. 翁恺老师C语言学习笔记(十)指针_运算符取得变量的地址

    指针(一) 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值.由于通过地址能找到所需的变量单元,可以说,地址指 ...

  4. 翁恺老师C语言学习笔记(十)指针_指针运算

    我们先看一段代码 #include <stdio.h>int main(void) {char ac[] = {0,1,2,3,4,5,6,7,8,9,};char *p = ac;pri ...

  5. 翁恺老师C语言学习笔记(十一)字符串_字符串常量

    字符串常量 char* s = "Hello,world!" 我们先看一段代码 #include<stdio.h>int main(void) {char *s = & ...

  6. 翁恺老师C语言学习笔记(十一)字符串

    字符数组 如果我们定义了这样的一个字符数组 char word[] = {'H','e','l','l','o','!'}; word[0] H word[1] e word[2] l word[3] ...

  7. 翁恺老师C语言学习笔记(九)数组的运算

    · 在一组给定的数据中,如何找出某个数据是否存在? 先看一段代码 #include<stdio.h> /* 找出key在数组a中的位置 @param key 要寻找的数字 @param a ...

  8. 翁恺老师C语言学习笔记(七)函数

    题目:求出1-10.20-30.35-45的三个和 #include<stdio.h>int main() {int i;int sum;for(i=1,sum=0;i<10;i++ ...

  9. 翁恺老师C语言学习笔记(八)数组

    · 如何写一个程序计算用户输入的数字的平均数 用户输入正整数,并计算输入数字的平均数,如果输入"-1"表示输入结束: #include<stdio.h>int main ...

最新文章

  1. pmp考试标准有哪些?
  2. Oracle RAC系列之:利用srvctl管理RAC数据库
  3. Shiro 教程,Shiro教程0.2 下载,Shiro功能修复与升级说明。
  4. Xamarin.FormsShell基础教程(5)Shell项目内容新建页面
  5. Spring 4 + Reactor Integration Example--转
  6. c# vscode 配置_使用VSCode开发C#项目
  7. 全球及中国有色金属行业产量规模与未来发展形势展望报告2021版
  8. Linux curl与wget 命令的区别和联系
  9. 手把手带你写一个中断输入设备驱动
  10. [转]Spring数据库读写分离
  11. java中如何传递参数给控制器_如何使用ui-router中的ui-sref将参数传递给控制器
  12. 支付宝将砸十亿支持中国女足发展:她们才是第一女子天团
  13. 全国计算机office二级选择题,全国计算机二级msoffice选择题汇总含答案
  14. mysql备份至cos_宝塔面板网站文件/数据库定时同步备份至腾讯云COS设置
  15. 【EI稳定检索】第二届计算机科学、电子信息工程和智能控制技术国际会议(CEI 2022)
  16. 别再用mybatis了,mybatis-plus 这个神级工具一发入魂
  17. 卖场型旗舰店好入驻吗?需要什么资料?
  18. Ubuntu下编译VeraCrypt
  19. Telnet、Mstsc、SSH之间的比较和区别
  20. js获取元素的方法及具体案例

热门文章

  1. 将Notepad++配置为Python编译器
  2. java 二叉树的各种遍历
  3. Windows Server 2008 R2 搭建FTP服务
  4. linux 编程头文件搜索规则
  5. 3d激光雷达开发(绘制长方体)
  6. 随想录(如何学习内核)
  7. AD教程系列 | 2-认识其他电子元器件的封装
  8. xml转java代码_java 中xml转换为Bean实例解析(纯代码)
  9. java线程内存溢出_Java常见问题分析(内存溢出、内存泄露、线程阻塞等)
  10. 动态网站的技术路线_派康大会官方网站建设项目开通上线啦!