函数形参:数组、结构体

一 数组作为形参

1、一维数组

一维数组名的值是一个指针常量,他的类型是“指向元素类型的指针”,它指向数组的第一个元素。
例如:定义int a[10]
则 创建了 a ,他指向了一个一维数组,包含10个元素, a 的值是一个指向他第一个元素的指针。
*(a + 1)=a[1]

2、多维数组

与一维数组一样,多维数组名的类型也是“指向元素类型的指针”,它指向数组的第一个元素。唯一的区别就是多维数组的第一维的元素是一个数组。
例如:定义int matrix[5][10]
则 创建了 matrix ,他可以看做是一个一维数组,包含3个元素,只是每个元素恰好是包含10个整型元素的数组。
matrix 这个名字的值是一个指向他第一个元素的指针,所以 matrix 是一个包含十个整型元素的数组的指针。
*( *(a + 1)+3)=a[1][3]

3、数组作为函数参数

3.1 作为参数的一维数组

作为参数的多维数组名的传递方式和一维数组名相同,实际传递的是一个指向数组第一个元素的指针。两者之间的区别在于,多维数组的每个元素本身是另一个数组。下举例说明:

int a[10];
...
fun(a)

参数 a 的类型是指向整型的指针,所以 fun 的原型可以是以下两种中的任何一种:

 void fun(int *b);
 void fun(int b[]);
void add_1(int *a, int num);
void add_2(int a[10]);
void add_3(const int a[10]);
int main()
{
	int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
   add_1(a,10);
   add_2(a);
   add_3(a);
   	cout << "*************" << endl;
   for (int i = 0; i < 10; ++i)
   {
   	cout << a[i] << endl;
   }
   return 0;
} 
void add_1(int *a, int num)
{
   for (int i = 0; i < num; ++i)
   {
   	cout << *(a + i) << endl;
   	*(a + i) = i * 2;
   	cout << *(a + i) << endl;
   }
}
void add_2(int a[10]) //也能修改数值,有点想不通
{
   for (int i = 0; i < 10; ++i)
   {
   	//cout << a[i] << endl;
   	a[i] = i * 2;
   	cout << a[i] << endl;
   }
}
void add_3(const int a[10])
{
   for (int i = 0; i < 10; ++i)
   {
   	//cout << a[i] << endl;
   	//a[i] = i * 2;
   	cout << a[i] << endl;
   }
}

因为 a 是一个指向整型数据的指针, b 也是一个指向整型数据的指针。所以第一种可以。

3.2 作为参数的多维数组

作为参数的多维数组名的传递方式和一维数组名相同,实际传递的是一个指向数组第一个元素的指针。两者之间的区别在于,多维数组的每个元素本身是另一个数组。

int matrix[7][10];
...
fun(matrix)

参数 matrix 的类型是指向包含10个整型元素的数组的指针,所以 fun 的原型可以是以下两种中的任何一种:

 void fun(int (*b)[10]);
 void fun(int b[][10]);

matrix是一个指向数组的指针,b就是一个指针数组,是一个指向整型数组的指针,类型相同,所以可以作为函数原型。把fun 写成下面就不对了:
void fun(int **C);
这个例子把 C 声明为一个指向整型指针的指针,他和指向整形数组的指针类型并不相同。

void add_1(int **a, int row, int col);
void add_2(int(*a)[10], int row,int col ); //数组指针的形式
void add_3(int a[][10], int row);
void add_4(int *a, int row, int col);
int main()
{
#if 0
//读取csv文件
	ifstream infile("C:\\Users\\Administrator\\Documents\\WeChat Files\\wxid_dwtghzrwfl0052\\FileStorage\\File\\2021-04\\圆弧波纹板长-10mms.csv");
	string line;
	getline(infile, line);
	int buffer[3][2000] = { 0 };
	int kk = 9;
	int row = 0;
	while (getline(infile, line))//getline(inFile, line)表示按行读取CSV文件中的数据
	{
		string field;
		istringstream sin(line); //将整行字符串line读入到字符串流sin中
		for (int scape = 0; scape < kk; ++scape)
		{
			getline(sin, field, ','); //将字符串流sin中的字符读入到field字符串中,以逗号为分隔符 
			//cout << atoi(field.c_str()) << " ";//将刚刚读取的字符串转换成int
		}

		getline(sin, field, ','); //将字符串流sin中的字符读入到field字符串中,以逗号为分隔符 
		buffer[0][row] = atoi(field.c_str());
		getline(sin, field, ','); //将字符串流sin中的字符读入到field字符串中,以逗号为分隔符 
		buffer[1][row] = atoi(field.c_str());
		getline(sin, field, ','); //将字符串流sin中的字符读入到field字符串中,以逗号为分隔符 
		buffer[2][row] = atoi(field.c_str());
		row++;
		//cout << field.c_str() << endl;//将刚刚读取的字符串转换成int
	}
	infile.close();
	cout << "共读取了:" << row << "行" << endl;
	cout << "读取数据完成" << endl;
#endif
	int a[2][10] = { {0,1,2,3,4,5,6,7,8,9},{10,11,12,13,14,15,16,17,18,19} };
	//add_1((int **)a,2,10);
	//add_2(a, 2, 10); 
	//add_3(a,2);
	//add_4((int *)a,2,10);
	cout << "*************" << endl;
	for (int i = 0; i < 10; ++i)
	{
		cout << a[0][i] << endl;
	}
	return 0;
} 

void add_1(int **a,int row,int col)
{
	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < col; j++)
			cout << *((int *)a + i * col + j) << "\t";
		cout << endl;
	}
}
void add_2(int(*a)[10], int row, int col)
{
	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < col; ++j)
		{
			cout << *(a[i] + j) << "\t";
			cout << a[i][j] << "\t";
		}
		cout << endl;
	}

}
void add_3(int a[][10], int row)
{
	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < 10; ++j)
			cout << a[i][j] << "\t";
		cout << endl;
	}
}
void add_4(int *a, int row,int col)
{
	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < col; j++)
			cout << *(a + i * col + j) << "\t";
		cout << endl;
	}
}


二 结构体作为形参

1. 传输方式与其他类型的变量和指针类似。


#include <iostream>
#include <cstring>
 
using namespace std;
void printshu( struct Books book );
 
// 声明一个结构体类型 Books 
struct Books
{
   char  title[30];
   char  author[30];
   char  subject[40];
   int   book_ISBN;
};
 
int main( )
{
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
 
    // Book1 详述
   strcpy( Book1.title, "月亮与六便士");
   strcpy( Book1.author, "毛姆"); 
   strcpy( Book1.subject, "文学");
   Book1.book_ISBN = 12345;

   // 输出 Book1 的信息
   printshu( Book1 );
   return 0;
}
void printshu( struct Books book )
{
   cout << "书标题 : " << book.title <<endl;
   cout << "书作者 : " << book.author <<endl;
   cout << "书类目 : " << book.subject <<endl;
   cout << "书 ID : " << book.book_ISBN <<endl;
}

2. 指向结构的指针

方式与定义指向其他类型变量的指针相似。为了查找结构变量的地址,需要把 & 运算符放在结构名称的前面。为了使用指向该结构的指针访问结构的成员,必须使用 -> 运算符,当不是指针时,使用.运算符。

#include <iostream>
#include <cstring>
using namespace std;
void printshu( struct Books *book );
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_ISBN;
};
 
int main( )
{
   Books Book1;        // 定义结构体类型 Books 的变量 Book1
 
    // Book1 详述
   strcpy( Book1.title, "月亮与六便士");
   strcpy( Book1.author, "毛姆"); 
   strcpy( Book1.subject, "文学");
   Book1.book_ISBN = 12345;
 
   // 通过传 Book1 的地址来输出 Book1 信息
   printshu( &Book1 );
   return 0;
}
// 该函数以结构指针作为参数
void printshu( struct Books *book )
{
   cout << "书标题  : " << book->title <<endl;
   cout << "书作者 : " << book->author <<endl;
   cout << "书类目 : " << book->subject <<endl;
   cout << "书 ID : " << book->book_ISBN <<endl;
}

其中的函数声明,void printshu( struct Books *book );形参就类似于定义指针的 int * p,此时 p 需要的是地址,所以当函数调用时,形参应该是结构体的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值