当前位置: 首页 > news >正文

邢台手机网站建设公司/网站生成app工具

邢台手机网站建设公司,网站生成app工具,武汉学做网站,重庆网络科技服务有限公司关于地址,指针,指针变量可以参考我的这篇文章: 地址,指针,指针变量是什么?他们的区别?符号(*)在不同位置的解释?_juechen333的博客-CSDN博客https://blog.csd…

关于地址,指针,指针变量可以参考我的这篇文章:

地址,指针,指针变量是什么?他们的区别?符号(*)在不同位置的解释?_juechen333的博客-CSDN博客icon-default.png?t=N176https://blog.csdn.net/qq_57342311/article/details/129225045

目录

一、引入

1.1实例

1.2解释

1.3变量名和数组名作函数参数的比较

二、程序举例

2.1引入

三、总结

3.1归纳

3.2用指针变量作实参、形参举例

3.3用指针变量作实参,数组名作形参举例


一、引入

1.1实例

#include<stdio.h>
int main()
{void fun(int arr[], int n);		//对fun函数进行声明int array[10];		//定义array数组...					//一系列操作fun(array, 10);		//用数组名作函数参数...					//一系列操作return 0;
}void fun(int arr[], int n)	//定义fun函数
{...		//一系列操作
}

array 是实参数组名,arr 为形参数组名,当用数组名作参数时,如果形参数组中各元素的值发生变化,实参数组元素的值随之变化。这究竟为什么呢?请继续往下看。

1.2解释

(1)先看数组元素作实参时的情况

如果已定义一个函数

void swap(int x, int y);

假设函数的作用是将两个形参( x , y )的值交换,进行函数调用

swap (a[1],a[2]);

用数组元素 a[1] 和 a[2] 作实参的情况,与用变量作实参时一样,是 “值传递” 方式,将 a[1] 和 a[2] 的值单向传递给 x 和 y 。当 x 和 y 的值改变时,a[1] 和 a[2] 的值并不改变。

(2)再看用数组名作函数参数的情况

实参数组名代表该数组首元素的地址,而形参是用来接收从实参传递过来的数组首元素地址的。因此,形参应该是一个指针变量(只有指针变量才能存放地址)。实际上,C编译都是将形参数组名作为指针变量来处理的。例如:

fun(int arr[],int n);

但在程序编译时是将 arr 按指针变量处理的,相当于将函数 fun 的首部写成

fun(int* arr,int n);

以上两种写法是等价的。在该函数被调用时,系统会在 fun 函数中建立一个指针变量 arr,用来存放从主调函数传递过来的实参数组首元素的地址。如果在fun函数中用运算符 sizeof 测定 arr 所占的字节数,可以发现 sizeof(arr) 的值为 4 (用 VisualC++ 时)。这就证明了系统是把 arr 作为指针变量来处理的(指针变量在 Visual C++ 中占4个字节)。

当 arr 接收了实参数组的首元素地址后,arr 就指向实参数组首元素,也就是指向 array[0]。因此,*arr 就是 array[0]。arr+1 指向 array[1],arr+ 2 指向 array[2],arr+3 指向 array[3]。也就是说,*(arr+1),*(arr+2), *(arr+3) 分别是 array[1],array[2],array[3]。

根据前面介绍过的知识,*(arr+i) 和 arr[i] 是无条件等价的。

因此,在调用函数期间,arr[0] 和 *arr 以及 array[0] 都代表数组 array 序号为 0 的元素,依此类推,arr[3],*(arr+ 3),array[3] 都代表 array 数组序号为 3 的元素。

1.3变量名和数组名作函数参数的比较

实参类型要求的形参类型传递的信息能否改变实参的值
变量名变量名变量的值不能
数组名数组名或指针变量实参数组首元素的地址

说明: C 语言调用函数时虚实结合的方法都是采用 “值传递” 方式,当用变量名作为函数参数时传递的是变量的值,当用数组名作为函数参数时,由于数组名代表的是数组首元素地址,因此传递的值是地址,所以要求形参为指针变量。

在用数组名作为函数实参时,既然实际上相应的形参是指针变量,为什么还允许使用形参数组的形式呢?这是因为在 C 语言中用下标法和指针法都可以访问一个数组(如果有一个数组 a,则 a[i] 和 *(a+i) 无条件等价),用下标法表示比较直观,便于理解。因此许多人愿意用数组名作形参,以便与实参数组对应。从应用的角度看,用户可以认为有一个形参数组,它从实参数组那里得到起始地址,因此形参数组与实参数组共占同一段内存单元,在调用函数期间,如果改变了形参数组的值,也就是改变了实参数组的值。在主调函数中就可以利用这些已改变的值。

注意:实参数组名代表一个固定的地址,或者说是指针常量,但形参数组名并不是一个固定的地址,而是按指针变量处理。

二、程序举例

2.1引入

将数组 a 中 n 个整数按相反顺序存放,实参用数组名 a,形参可用数组名,也可用指针变量名。

(1)形参用数组名

#include<stdio.h>
int main()
{void inv(int x[], int n);	//函数声明int a[10] = { 1,2,3,4,5,6,7,8,9,10 };for (int i = 0; i < 10; i++)	//输出未交换时数组各元素的值{printf("%d ", a[i]);}printf("\n");inv(a, 10);		//调用函数for (int i = 0; i < 10; i++)	//输出交换后数组各元素的值{printf("%d ", a[i]);}
}void inv(int x[], int n)	//形参x是数组名
{int temp;for (int i = 0; i < (n - 1) / 2; i++){int j = n - 1 - i;temp = x[i];x[i] = x[j];x[j] = temp;}
}

运行结果:

分析:

程序分析:在main函数中定义整型数组 a,并赋予初值。函数 inv 的形参数组名为 x。在定义 inv 函数时,可以不指定形参数组 x 的大小(元素的个数)。因为形参数组名实际上是一个指针变量,并不是真正地开辟一个数组空间(定义实参数组时必须指定数组大小,因为要开辟相应的存储空间)。inv 函数的形参 n 用来接收需要处理的元素的个数。在 main 函数中有函数调用语句 “inv(a,10);",表示要求对 a 数组的 10 个元素实行题目要求的颠倒排列。如果改为 “inv(a,5);",则表示要求将 a 数组的前 5 个元素实行颠倒排列,此时,函数 inv 只处理5个数组元素。

(2)形参用指针变量名

#include<stdio.h>
int main()
{void inv(int* x, int n);	//函数声明int a[10] = { 1,2,3,4,5,6,7,8,9,10 };for (int i = 0; i < 10; i++)	//输出未交换时数组各元素的值{printf("%d ", a[i]);}printf("\n");inv(a, 10);		//调用函数for (int i = 0; i < 10; i++)	//输出交换后数组各元素的值{printf("%d ", a[i]);}
}void inv(int* x, int n)	//形参x是指针变量
{int temp;int* i = x;int* j = x + n - 1;for (; i < x + (n - 1) / 2; i++, j--){temp = *i;*i = *j;*j = temp;}
}

运行结果:

三、总结

3.1归纳

如果有一个实参数组,要想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下 4 种情况。

(1)实参和形参都用数组名

int main()
{void f(int x[], int n);int a[10];...f(a, 10);	//实参用数组名...
}void f(int x[], int n)	//形参用数组名
{...
}

(2)实参用数组名,形参用指针变量

int main()
{void f(int* x, int n);int a[10];...f(a, 10);	//实参用数组名...
}void f(int* x, int n)	//形参用指针变量
{...
}

(3)实参和形参都用指针变量

int main()
{void f(int* x, int n);int a[10];int* p = a;...f(p, 10);	//实参用指针变量...
}void f(int* x, int n)	//形参用指针变量
{...
}

(4)实参用指针变量,形参用数组名

int main()
{void f(int x[], int n);int a[10];int* p = a;...f(p, 10);	//实参用指针变量...
}void f(int x[], int n)	//形参用数组名
{...
}

3.2用指针变量作实参、形参举例

改写(二)中的实例

#include<stdio.h>
int main()
{void inv(int* x, int n);	//函数声明int a[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = a;for (int i = 0; i < 10; i++)	//输出未交换时数组各元素的值{printf("%d ", a[i]);}printf("\n");inv(p, 10);		//调用函数for (int i = 0; i < 10; i++)	//输出交换后数组各元素的值{printf("%d ", a[i]);}
}void inv(int* x, int n)	//形参x是指针变量
{int temp;int* i = x;int* j = x + n - 1;for (; i < x + (n - 1) / 2; i++, j--){temp = *i;*i = *j;*j = temp;}
}

运行结果:

3.3用指针变量作实参,数组名作形参举例

对数组 a[10] 由大到小进行排序,采用选择排序的算法

#include<stdio.h>
int main()
{void sort(int x[], int n);	//函数声明int a[10] = { 1,3,5,7,9,2,4,6,8,10 };int* p = a;for (int i = 0; i < 10; i++)	//输出未交换时数组各元素的值{printf("%d ", a[i]);}printf("\n");sort(p, 10);		//调用函数for (int i = 0; i < 10; i++)	//输出交换后数组各元素的值{printf("%d ", a[i]);}
}void sort(int x[], int n)
{for (int i = 0; i < n - 1; i++)		//i的取值范围[0,n-1){int max_idx = i;	//记录最大数值所在位置for (int j = i + 1; j < n; j++)	//j的取值范围[1,n){if (x[j] > x[max_idx]) { max_idx = j; }	//更新最大值所在位置}if (max_idx != i)	//进行交换{int temp;temp = x[i];x[i] = x[max_idx];x[max_idx] = temp;}}
}

运行结果:

上面 sort 函数中是用数组名作为形参,也可以用指针变量作为形参

void sort(int* x, int n)
{for (int i = 0; i < n - 1; i++)		//i的取值范围[0,n-1){int max_idx = i;	//记录最大数值所在位置for (int j = i + 1; j < n; j++)	//j的取值范围[1,n){if (*(x + j) > *(x + max_idx)) { max_idx = j; }	//更新最大值所在位置}if (max_idx != i)	//进行交换{int temp;temp = *(x + i);*(x + i) = *(x + max_idx);*(x + max_idx) = temp;}}
}
http://www.jmfq.cn/news/5150089.html

相关文章:

  • 织梦系统做网站/互联网推广方案
  • 玩具网站建设策划书/建站软件
  • 国外好的网站空间/网络销售怎么聊客户
  • 丰台网站建设联系方式/发表文章的平台有哪些
  • 网页怎么截图快捷键/seo排名点击
  • 网站建设需要的语言/如何结合搜索检索与seo推广
  • 公司建设网站的申请报告/厦门百度推广怎么做
  • 中国建设银行网站快速查询/微信营销推广的方式有哪些
  • 个人做盈利慈善网站/曼联vs恩波利比分
  • 外贸做的社交网站/互动营销成功案例
  • 零基础学做网页/seo排名优化公司价格
  • 营销网站制作免费咨询/河南最新消息
  • 盘锦做网站建设的/阐述网络推广的主要方法
  • 建立网站ftp是什么/百度网盘服务电话6988
  • 传统网站开发/网站收录优化
  • 用wordpress设计html5/广州新塘网站seo优化
  • 怎么做移动网站吗/苏州网站建设费用
  • 网站建设找王科杰信誉/保定百度首页优化
  • 自己做网站推广/李守洪排名大师怎么样
  • 网站建设seo 视频教程/互联网推广运营是干什么的
  • 手机版网站建设价格/长沙免费网站建站模板
  • 广州旅游网站建设设计/百度推广怎么做的
  • wordpress smtp设置163/百度搜索引擎优化的养成良好心态
  • 技术先进的网站建设公司/教程推广优化网站排名
  • 美橙互联网站建设进不去/吉林seo排名公司
  • 郑州专业建站报价/百度推广账户搭建
  • 汉阳网页设计/seo内链优化
  • 敦煌网站外引流怎么做/微博推广方式有哪些
  • 网站建设定制开发价格/守游网络推广平台
  • 网站建设工资 优帮云/代写文章平台