函数、指针
本文最后更新于:2022年4月22日 上午
函数、指针
函数
函数的声明
函数的声明需要在 main
函数前面先声明,在 main
函数里面才能够使用
在函数名前定义返回值类型,如果没有返回值则 定义 void
#include <iostream>;
using namespace std;
// 函数的声明需要在函数名前定义 返回值类型,如果没有返回值则 定义 void
void sayHello() {
cout << "hello world" << endl;
}
int main() {
sayHello();
system("pause");
return 0;
}
函数的声明与实现分离
可以在 main
函数前只声明,在后面再实现
#include <iostream>;
using namespace std;
// 只声明,没有实现
void sayHello();
int main() {
sayHello();
system("pause");
return 0;
}
void sayHello() {
cout << "hello world" << endl;
}
函数的分文件编写
1、先在头文件新建 add.h
,这个文件只声明函数,不实现
#include <iostream>;
using namespace std;
int add(int a, int b);
2、在源文件新建同名文件的 add.cpp
文件,这个文件里面是函数的具体实现
// 包含需要实现的头文件
#include "add.h";
int add(int a, int b) {
return a + b;
}
3、在需要使用的地方直接引入 add.h
头文件
#include <iostream>;
using namespace std;
#include "add.h";
int mainarr() {
cout << "函数分文件编写" << endl;
cout << "10 + 20 = "<< add(10, 20) << endl;
system("pause");
return 0;
}
输出
30
|- 头文件
|- add.h
|- 源文件
|- add.cpp
|- main.cpp
指针
指针是 C/C++
的灵魂,所以学号指针很重要
指针的占用空间是4
字节
指针的基本使用
通过 类型*
来声明一个指针,通过 &xxx
取地址符来获取变量的内存地址
int num = 10;
int* p;
p = #
cout << "指针的大小" << sizeof(*p) << endl;
cout << "指针的值" << *p << endl;
cout << "指针的地址" << p << endl;
输出
指针的大小4
指针的值10
指针的地址0078F6D8
也可以声明时赋值,和以上的结果是一样的
int* p1 = #
空指针
空指针,0 暂时没有赋值的指针
空指针访问时在编译期会报错
int* p2 = NULL;
cout << "空指针" << *p2 << endl;
引发了异常: 读取访问权限冲突。
p2 是 nullptr。
野指针
野指针,指向不是当前程序申请的内存,没有权限访问这块内存
int* p3 = (int)0x12345;
// 语法报错
const 关键字修饰指针
通过 const
来修饰指针,不能修改值,可以修改地址
const int* p3 = &num1;
p3 = &num2;
*p2 = 100; // 报错,不能给一个常量指针赋值
不能修改指针,可以修改地址
int* const p4 = &num1;
*p4 = 100;
p4 = &num2; // 报错,表达式必须是一个可以修改的左值
指针与数组(通过指针来遍历数组)
int arr[] = { 1,2,3,4,5 };
// 因为直接访问数据就是获取的数组的首地址
int* p5 = arr;
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
// 通过 *xx 解引用来访问值,然后 再让地址 ++
cout << *p5 << endl;
p5++;
}
指针与函数(函数的引用传递)
// 交换两个变量
void exchange(int *num1, int *num2) {
int temp = *num1;
*num1 = *num2;
*num2 = temp;
}
// --------------------------------------------
int nump1 = 10;
int nump2 = 20;
cout << "交换前" << nump1 << nump2 << endl;
// 传递地址进去
exchange(&nump1, &nump2);
cout << "交换后" << nump1 << nump2 << endl;
输出
交换前10 20
交换后20 10
指针的案例(通过传递数组来进行修改数据)
// 数组填充
void arrayFill(int arr[], int len, int fillVal) {
for (int i = 0; i < len; i++) {
arr[i] = fillVal;
}
}
// 打印数组
void printArr(int arr[], int len) {
for (int i = 0; i < len; i++) {
cout << arr[i] << endl;
}
}
// --------------------------------------------
int arr[] = { 1,2,3,4,5 };
cout << "数组填充前" << endl;
printArr(arr, sizeof(arr) / sizeof(arr[0]));
arrayFill(arr, sizeof(arr) / sizeof(arr[0]), 9);
cout << "数组填充后" << endl;
printArr(arr, sizeof(arr) / sizeof(arr[0]));
输出
数组填充前
1
2
3
4
5
数组填充后
9
9
9
9
9
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议,转载请注明出处。