user-0 提问: 关于数组函数的疑问

回复:
user: user-1
content: 如果是我，将数组声明为全局变量，函数无参数，直接读写全局数组变量。

user: user-2
content: 形参是形参，实参是实参，不一样。调用函数的时候是把实参复制了一份传给了形参，在子函数里改变形参的值并不会改变实参的值，如果需要在子函数里改变实参的值，需要传实参的地址进去，对实参的地址进行取值访问，然后对这个结果进行赋值就可以改变实参的值。

user: user-3
content: 问题描述要准确 形参实参在任何时候都不同

user: user-4
content: 引用 3 楼 user-6 的回复:C，C++数组在参数传递的时候，传递的是指针； 如果在函数里，改变这个指针的值，则不能修改实参，除非采用C++引用传递。  如果修改数组元素，因为这其实就是通过指针，修改指针指向的对象； 所以实参数组的的每个元素可以被改变。  从参数传递的角度考虑，除了C++的引用传递，可以改变实参本身以外；  C，C++的其他方式都是值传递，实参本身是不会被修改的，值传递是单向的。  PS： 指针参数值传递，可以改变数组元素，不可以改变指针本身。  ++

user: user-5
content: 形参 和实参 一样的吗  是什么意思？  1  形参名字 跟 实参 名字可以不一样  2  这个函数调用后， 会改变 参数的值

user: user-6
content: C，C++数组在参数传递的时候，传递的是指针； 如果在函数里，改变这个指针的值，则不能修改实参，除非采用C++引用传递。  如果修改数组元素，因为这其实就是通过指针，修改指针指向的对象； 所以实参数组的的每个元素可以被改变。  从参数传递的角度考虑，除了C++的引用传递，可以改变实参本身以外；  C，C++的其他方式都是值传递，实参本身是不会被修改的，值传递是单向的。  PS： 指针参数值传递，可以改变数组元素，不可以改变指针本身。

user: user-0
content: 疑问就在这里，这里形参和实参是一样的，实参与形参之间还是单身传递的吗，为什么我这个程序就可以将实参n的值改变，源code如下 #include  <stdio.h>  #define STU 30 #define COURSE 3  void Input(long num[],int score[][COURSE],int n); void GetSumAver(int score[][COURSE],int n,int sum[],float aver[]); void Sort(long num[],int score[][COURSE],int n,int sum[],float aver[]); void Print(long num[],int score[][COURSE],int n,int sum[],float aver[]); int  Search(long num[], int n, long x);  main() { 	int n, score[STU][COURSE], sum[STU], pos; 	long num[STU], x; 	float aver[STU];  	printf("Please enter the total number of the students(n<=30):"); 	scanf("%d", &n);					/*输入参加考试的学生人数*/  	printf("Enter No. and score as: MT  EN  PH\n"); 	Input(num, score, n);				/*输入学生成绩*/  	GetSumAver(score, n, sum, aver);	/*计算总分和平均分*/ 	printf("Before sort:\n"); 	Print(num, score, n, sum, aver);  	Sort(num, score, n, sum, aver);		/*排名次*/ 	printf("After sort:\n"); 	Print(num, score, n, sum, aver);  	printf("Please enter searching number:"); 	scanf("%ld", &x);					/*以长整型格式输入待查找学生的学号*/ 	pos = Search(num, n, x);			/*名次查询*/ 	if (pos != -1) 	{ 		printf("position:\t  NO \t  MT \t  EN \t  PH \t  SUM \t AVER\n"); 		printf("%8d\t%4ld\t%4d\t%4d\t%4d\t%5d\t%5.0f\n", 				     pos+1,num[pos],	score[pos][0],score[pos][1], 				     score[pos][2],	sum[pos],aver[pos]); 	} 	else 	{ 		printf("Not found!\n"); 	} }  /* 函数功能：输入某班学生期末考试三门课程成绩    函数参数：长整型数组num，存放学生学号              整型数组score，存放学生成绩 			    整型变量n，存放学生人数    函数返回值：无 */ void Input(long num[], int score[][COURSE], int n) { 	int  i, j;  	for (i=0; i<n; i++) 	{ 		scanf("%ld", &num[i]); 		for (j=0; j<COURSE; j++) 		{ 				scanf("%d", &score[i][j]); 		} 	} }  /* 函数功能：计算每个学生的总分和平均分    函数参数： 整型数组score，存放学生成绩 			     整型变量n，存放学生人数 		整型数组sum，计算得到的每个学生的总分 				实型数组aver，计算得到的每个学生的平均分    函数返回值：无 */ void GetSumAver(int score[][COURSE], int n, int sum[], float aver[]) { 	int i, j;  	for (i=0; i<n; i++) 	{ 		sum[i] = 0; 		for (j=0; j<COURSE; j++) 		{ 				sum[i] = sum[i] + score[i][j]; 		} 		aver[i] = (float)sum[i] / COURSE; 	} }  /* 函数功能：按总分成绩由高到低排出成绩的名次    函数参数：长整型数组num，存放学生学号              整型数组score，存放学生成绩 			整型变量n，存放学生人数 			整型数组sum，存放每个学生的总分 			实型数组aver，存放每个学生的平均分    函数返回值：无 */ void Sort(long num[],int score[][COURSE], int n, int sum[], float aver[]) { 	int i, j, k, m; 	int temp1; 	long temp2; 	float temp3;  	for (i=0; i<n-1; i++) 	{ 		k = i; 		for (j=i+1; j<n; j++) 		{ 				if (sum[j] > sum[k])  k = j; 		} 		if (k != i) 		{ 				temp1 = sum[k];  sum[k] = sum[i];  sum[i] = temp1; 				temp2 = num[k];  num[k] = num[i];  num[i] = temp2; 				temp3 = aver[k];  aver[k] = aver[i];  aver[i] = temp3; 				for (m=0; m<COURSE; m++) 				{ 					temp1 = score[k][m]; 					score[k][m] = score[i][m]; 					score[i][m] = temp1; 				} 		} 	} }  /* 函数功能： 打印名次表，表格内包括学生编号、各科分数、总分和平均分    函数参数： 长整型数组num，存放学生学号 				整型数组score，存放学生成绩 				整型变量n，存放学生人数 				整型数组sum，存放每个学生的总分 				实型数组aver，存放每个学生的平均分    函数返回值：无 */ void Print(long num[], int score[][COURSE], int n, 				int sum[], float aver[]) { 	int  i, j;  	printf("  NO \t|   MT \t  EN \t PH \t SUM \t AVER\n"); 	printf("----------------------------------------------------\n"); 	for (i=0; i<n; i++) 	{ 		printf("%ld\t| ", num[i]); 		for (j=0; j<COURSE; j++) 		{ 				printf("%4d\t", score[i][j]); 		} 		printf("%5d\t%5.0f\n", sum[i], aver[i]); 	} }  /* 函数功能：在学号数组中顺序查找学生的学号    函数参数：长整型数组num，存放学生学号              整型变量n，存放学生人数 		长整型变量x，存放待查找学生的学号    函数返回值：找到时，返回学生学号在学号数组中的下标位置，否则返回值-1 */ int Search(long num[], int n, long x) { 	int  i;  	for (i=0; i<n; i++) 	{ 		if (num[i] == x)  return(i); 	} 	return (-1); }