本文目录
一 数组作为形参
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 需要的是地址,所以当函数调用时,形参应该是结构体的地址。