一、数组传参中关于形式参数的奥秘
形参中不存在数组的概念,即便中括号约定了数组的大小,也无效,传递的是一个地址,是数组的首地址
#include <stdio.h>
void printData(int data)
{
printf("%d\n",data);
}
void printArr(int arry[10])//形参中不存在数组的概念,即便中括号约定了数组的大小,也无效.
//传递是一个地址,是数组的首地址
{
int i;
printf("printArr: arry的大小是:%d\n",sizeof(arry));//在os用8个字节来表示一个地址
for(i=0;i<10;i++){
printf("%d ",arry[i]);
}
putchar('\n');
}
int main()
{
int arry[10] = {1,2,3,4,5,6,7,8,9,10};
printf("main: arry的大小是:%d\n",sizeof(arry));
printArr(arry);
return 0;
}
运行结果
二、数组实参很有意思的问题启发(关于后面的指针)
#include <stdio.h>
void changeData(int data)//数值传递,操作的是不同的内存空间
{
data = data + 100;
printf("address: %p,dataInfunc = %d\n",&data,data);
}
int main()
{
int data = 10;
changeData(data);
printf("address: %p,data = %d\n",&data,data);
}
传递的是值而非地址,所以最后得到的结果不一样
#include <stdio.h>
void changeData(int data[])//操作一定是相同的内存空间,数组名当作实参,到底传了什么(地址)
{
data[0] = data[0] + 100;
printf("dataInFunc = %d\n",data[0]);
}
int main()
{
int data[2] = {10,20};
changeData(data);
printf("data = %d\n",data[0]);
}
数组,传递过去的是它的首地址,所以最后的值相同
三、二维数组作为形参要注意的问题
补充说明
四、输出一个三行四列的矩阵,并找出最大值
#include <stdio.h>
void printArryDouble(int arr[][4],int ihang, int ilie )
{
int i;
int j;
for(i=0;i<ihang;i++){
for(j=0;j<ilie;j++){
printf("%d ",arr[i][j]);
}
putchar('\n');
}
}
void initArryDouble(int arr[][4],int ihang, int ilie)
{
int i;
int j;
for(i=0;i<ihang;i++){
for(j=0;j<ilie;j++){
printf("请输入第%d行,第%d列的数据\n",i+1,j+1);
scanf("%d",&arr[i][j]);
}
}
}
int getMaxDataFromArryDouble(int arr[][4],int ihang, int ilie)
{
int i;
int j;
int max;
max = arr[0][0];
for(i=0;i<ihang;i++){
for(j=0;j<ilie;j++){
if(max < arr[i][j]){
max = arr[i][j];
}
}
}
return max;
}
int main()
{
int max;
int arr[3][4];//特殊的一维数组,每个元素又是一个数组,大小确定
initArryDouble(arr,3,4);
printArryDouble(arr,3,4);
max = getMaxDataFromArryDouble(arr,3,4);
//max = getMaxDataFromArryDouble(&arr[0][0],3,4);
printf("二维数组中最大的值是%d\n",max);
return 0;
}