【数据结构(青岛大学 王卓)】第2章 线性表 学习笔记(三)2.4 补充:类C语言有关操作1、2.4 补充:类C语言有关操作2

目录

2.4 补充:类C语言有关操作1

1、元素类型说明

(1)顺序表类型定义

(2)数组定义

2、C语言的内存动态分配

3、C++的动态存储分配

4、C++中的参数传递

2.4 补充:类C语言有关操作2

1、C++中的参数传递

(1)传值方式

(2)传地址方式(指针变量作参数)

(3)传地址方式(数组名作参数)

(4)传地址方式(引用类型作参数)

2、引用类型作形参的三点说明


2.4 补充:类C语言有关操作1

1、元素类型说明

(1)顺序表类型定义

//顺序表类型定义
typedef struct{
	ElemType data[];
	int length;
}SqList;//顺序表类型

typedef char ElemType;
typedef int ElemType;

typedef struct{
	float p;
	int e;
}Polynomial;

typedef struct{
	Polynomial *elem;
	int length;
}SqList;

(2)数组定义

数组静态分配:

//数组静态分配
typedef struct{
	ElemType data[MaxSize];
	int length; 
}SqList;//顺序表类型

数组动态分配:

//数组动态分配 
typedef struct{
	ElemType *data;
	int length; 
}SqList;//顺序表类型

SqList L;
L.data = (ElemType*)malloc(sizeof(ElemType) * MaxSize);

2、C语言的内存动态分配

//C语言的内存动态分配 
SqList L;
L.data = (ElemType*)malloc(sizeof(ElemType) * MaxSize);

①malloc(m)函数,开辟m字节长度的地址空间,并返回这段空间的首地址。

②sizeof(x)运算,计算变量x的长度。

③free(p)函数,释放指针p所指变量的存储空间,即彻底删除一个变量。

备注:需要加载头文件:<stdlib.h>。

3、C++的动态存储分配

new 类型名T(初值列表)
    功能:
        申请用于存放T类型对象的内存空间,并依初值列表赋以初值
    结果值:
        成功:T类型的指针,指向新分配的内存
        失败:0(NULL)
delete 指针P
    功能:
        释放指针P所指向的内存。P必须是new操作的返回值。
//C++的动态存储分配
int *p1 = new int;
int *p1 = new int(10);
delete p1;

4、C++中的参数传递

函数调用时传送给形参表的实参必须与形参三个一致:类型、个数、顺序。

参数传递有两种方式:传值方式(参数为整型、实型、字符型等)和传地址(参数为指针变量;参数为引用类型;参数为数组名)。

2.4 补充:类C语言有关操作2

1、C++中的参数传递

(1)传值方式

把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能。函数修改的是副本的值,实参的值不变。

//传值方式
#include <iostream.h>

void swap(float m, float n){
	float temp;
	temp = m;
	m = n;
	n = temp;
}

void main(){
	float a, b;
	cin >> a >> b;
	swap(a, b);
	cout << a << endl << b << endl;
}

(2)传地址方式(指针变量作参数)

形参变化影响实参。

//形参变化影响实参
#include <iostream.h>

void swap(float *m, float *n){
	float t;
	t = *m;
	*m = *n;
	*n = t;
}

void main(){
	float a, b, *p1, *p2;
	cin >> a >> b;
	p1 = &a, p2 = &b;
	swap(p1, p2);
	cout << a << endl << b << endl;
}

形参变化不影响实参??

//形参变化不影响实参??
#include <iostream.h>

void swap(float *m, float *n){
	float *t;
	t = m;
	m = n;
	n = t;
}

void main(){
	float a, b, *p1, *p2;
	cin >> a >> b;
	p1 = &a, p2 = &b;
	swap(p1, p2);
	cout << a << endl << b << endl;
}

(3)传地址方式(数组名作参数)

传递的是数组的首地址,对形参数组所做的任何改变都将反映到实参数组中。

//传地址方式(数组名作参数)
#include <iostream.h>

void sub(char b[]){
	b[] = "world";
}

void main(void){
	char a[10] = "hello";
	sub(a);
	cout << a << endl;
}

用数组作函数的参数,求10个整数的最大数。

//用数组作函数的参数,求10个整数的最大数。
#include <iostream.h>

#define N 10

int max(int a[]);

void main(){
	int a[10];
	int i, m;
	for(i = 0; i < N; i++){
		cin >> a[i];
	}
	m = max(a);
	cout << "the max number is:" << m;
}

int max(int b[]){
	int i, n;
	n = b[0];
	for(i = 1; i < N; i++){
		if(n < b[i]){
			n = b[i];
		}
	}
	return n;
}

例:用数组作为函数的参数,将数组中n个整数按相反的顺序存放,输入和输出在主函数中完成。

//例:用数组作为函数的参数,将数组中n个整数按相反的顺序存放,输入和输出在主函数中完成。
#include <iostream.h>

#define N 10

void sub(int b[]){
	int i, j, temp, m;
	m = N / 2;
	for(i = 0; i < m; i++){
		j = N - 1 -i;
		temp = b[i];
		b[i] = b[j];
		b[j] = temp;
	}
	return;
}

void main(){
	int a[10], i;
	for(i = 0; i < N; i++){
		cin >> a[i];
	}
	sub(a);
	for(i = 0; i < N; i++){
		cout << a[i];
	}
}

(4)传地址方式(引用类型作参数)

什么是引用???

引用:它用来给一个对象提供一个替代的名字。

//传地址方式(引用类型作参数)
#include <iostream.h>

void main(){
	int i = 5;
	int &j = i;
	i = 7;
	cout << "i=" << i << " j=" << j;
}

备注:j是一个引用类型,代表i的一个替代名。i值改变时,j值也跟着改变,所以会输出i=7 j=7。

//传地址方式(引用类型作参数)
#include <iostream.h>

void swap(float &m, float &n){
	float temp;
	temp = m;
	m = n;
	n = temp;
}

void main(){
	float a, b;
	cin >> a >> b;
	swap(a, b);
	cout << a << endl << b << endl;
}

2、引用类型作形参的三点说明

①传递引用给函数与传递指针的效果是一样的,形参变化实参也发生变化。

②引用类型作形参, 在内存中并没有产生实参的副本,它直接对实参操作;而一般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好。

③指针参数虽然也能达到与使用引用的效果,但在被调函数中需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值