c++课本例题及知识点验证(数组作为函数参数||指针类型的注意事项||对象组的使用&类的静态成员||this指针的使用)

这篇博客探讨了C++中数组作为函数参数时如何传递地址,指针类型的注意事项,包括指向常量的指针和指针常量的区别,以及void类型指针的使用。此外,还讲解了对象数组的声明与使用,特别是静态成员在类中的应用,包括静态数据成员的声明、初始化和访问方式。最后,介绍了this指针在成员函数中的作用,强调了构造函数中初始化指针成员的正确做法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

知识点一:数组作为函数参数(形参重新开辟内存单元接收实参地址)

知识点二:指针类型的注意事项

知识点三:对象组的使用&类的静态成员

① 对象组的使用

② 类的静态成员 

知识点四:this指针的使用


知识点一:数组作为函数参数

  • 数组元素和数组名都可以作为函数的参数以实现函数之间数据的共享和传递;
  • 使用数组名传递数据时,传递的是地址
  • 形参数组和实参数组的首地址重合:形参数组重新开辟内存单元来接收实参数组的地址值,如图③。
  • 形参数组本质上就是接收实参地址的指针变量,它本身是有地址的,它所指向的空间内存放的是实参传来的地址。

【另】引用共享内存,数据互相可以修改;虽然数组形实参不共享单元,但是可以通过形参改变实参(因为本质是通过指针修改) 

运行到光标处来监视形参和实参的变化如图 ↓

//题目:求每一行元素之和
#include<iostream>
using namespace std;

void rowsum(int a[][4], int nrow)//计算二维数组每行元素的值的和——形参数组和实参数组首地址重合
{
	for (int i = 0; i < nrow; i++)
	{
		for (int j = 1; j < 4; j++)
			a[i][0] += a[i][j];
	}
}

int main()
{
	int table[3][4]={ 1,2,3,4,2,3,4,5,3,4,5,6 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0;j < 4; j++)
		{
			cout << table[i][j] << " ";
		}
		cout << endl;
	}
	rowsum(table, 3);//利用数组名作为函数的参数进行函数间数据传递与共享时传递的时首地址
	for (int i = 0; i < 3; i++)
	{
		cout << "sum of the row " << i << " is " << table[i][0] << endl;
	}
	return 0;
}

知识点二:指针类型的注意事项

1.指向常量的指针 

  • 声明指向常量的指针,不能通过指针改变所指对象的值,但是指针本身可以改变,可以指向另外的对象;
  • 使用指向常量的指针,可以保证指针所指的常量不被意外改变。

2.指针类型的常量 

  • 指针本身的值不能改变,指针指向的内容可变 

 3.void类型的指针

 一般情况下,指针的值只能赋给相同类型的指针,但void类型的指针可以存储任何类型的对象地址,经过使用类型显式转换,通过void类型的指针可以访问任何类型的数据。

知识点三:对象数组的使用&类的静态成员

① 对象数组的使用

对象数组的元素是对象,不仅具有数据成员,还具有函数成员。

声明一个一维数组的语句形式

类名 数组名[常量表达式];

每一个数组元素都是一个对象,通过对象访问其共有成员的一般形式:

数组名[下标表达式].成员名;

② 类的静态成员 

静态数据成员具有静态生存期;

静态数据成员不属于任何一个对象,因此可以通过类名对它进行访问

类名::标识符

在类的定义中仅仅对静态数据成员进行引用性声明,必须在文件作用域的某个地方使用类名限定进行定义性声明,此时也可以进行初始化,即类内定义类外初始化

 静态成员函数一般习惯于通过类名调用;

静态成员函数可以直接访问该类的静态数据和函数成员,访问非静态成员,必须经过对象名。

<题目:上机实验时随手写的,只是为了验证知识点 >代码如下:

所含知识点:

  •  静态成员函数访问非静态成员必须经过对象名
  • 对象数组的使用

#include<iostream>
using namespace std;

class A  //定义一个类来存放数字并输出
{
public:
	A(int x) :x(x) {}
	static void print(A a);
private:
	int x;
};

void A::print(A a)  //形参为对象名
{
	//cout << "a=" << x << endl;  //静态成员函数访问非静态成员必须通过对象名
	cout << "a=" << a.x << endl;
}

int main()
{
	A a[3] = { A(2),A(3),A(4) };  //对象数组的使用
	a[0].print(a[0]);
	return 0;
}

知识点四:this指针的使用

this指针是一个隐含于每一个类的非静态成员函数中的特殊指针,它用于指向正在被成员函数操作的对象。

this指针实际上是类成员函数的一个隐含参数。在调用类的成员函数时,目的对象的地址会自动作为该参数的值,传递给被调用的成员函数,这样被调函数就能够通过this指针来访问目的对象的数据成员。对于常成员函数来说,这个隐含参数是常指针类型的(指向常量的指针const int)。

在构造函数中,不可写成下面这种形式

class A
{
public:
  A(int* x){*this->x=*x;} //X
private:
  int* x;
};

构造函数的目的是使数据成员初始化,而对于没有初始化的指针是野指针,不能用*进行访问。


 更新于6_6

更新于6_8

更新于6_12

更新于6_22 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值