C++学习五

函数-C++编程模块

给出一个基本的函数声明框架
在这里插入图片描述

函数参数与按值传递

对于一个函数而言,当它被调用时,参数都是按值传递的,也就是说传进去的只是一个副本,无论你对这个副本做任何修改都是对实际参数没有任何影响的。而在函数中声明的变量包括形参全部都是函数所私有的,被调用时,计算机为它们分配内存,当调用完毕时,计算机会释放这些内存。举个例子

#include <fstream>
#include <iostream>
using namespace std;
void cube(int x)
{
	x = x*x*x;
	cout << x << endl;

}
int main()
{

	int x = 2;
	cube(x);
	cout << x << endl;
	return 0;
}
输出结果:
8
2

但如果传进去的是一个引用或者指针,情况则大不一样,不信我们试试

#include <fstream>
#include <iostream>
using namespace std;
void cube(int& x)//void cube(int* x)
{
	x = x*x*x;
	cout << x << endl;//打印8

}
int main()
{

	int x = 2;
	cube(x);//cube(&x)
	cout << x << endl;//打印8
	return 0;
}

先说引用,引用只是一个别名,实际的主体只有一个,其中不涉及拷贝对象,从始至终就只有一个对象,所以形参作为引用是不占用内存空间的,因此你对这个形参的任何操作都会反映到实参上去。指针的话很简单,你传进去的是一个地址值,这个地址值不管你复印多少个它始终是一个地址,就好比你门牌号不管复印多少个,最终房子只有一个,所以你传进去的指针它指向的内存是不会变的,那么你通过指针间接访问修改其实也是完全没有问题,符合预期的,因为这房子是真真实实存在的。
:两个恒等式

arr[i]==*(arr+i)
&arr[i]==arr+i
指针和const

有三种指针,区别在于const的位置

const int*p;//指向常量的指针,即不能通过*p修改
int const *p;//指向常量的指针
const int*const p;//指针常量,即p本身不能修改
int* const  p;//指向常量的常指针,即*p和p都不能被修改

例子

int x=3;
const int*p=&x;//ok
*p=4;//error,*p不是可修改的左值
cout<<*p<<endl;//display 3
x=4;//ok
cout<<*p<<endl;//display 4;
int*const q=&x;//ok
int y=8;
q=&y;//error,q不能被修改
函数和二维数组
int data[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//一个二维数组
int total=sum(data,3);//error

如果要计算这个二维数组的和,那么该如何传递这个参数?很显然data有三个元素,每个元素都是一个包含四个整数的一维数组。所以data类型是一个指向4个整数的数组的指针,正确的原型如下:

int sum(int (*p)[4],3);//第一种
int sum(int p[][4],3);//第二种

二维数组元素访问和指针的关系

arr[3][4]=*(*(arr+3)+4);
函数与结构

主要涉及函数的按值传递和按地址传递,由于按值传递涉及到拷贝,所以一旦结构体过大,那么拷贝所带来的花销也就更大,因此按地址传递才是比较合理的选择,传进一个指针,然后用指针来访问内部成员。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值