函数、指针

本文最后更新于: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 = &num;

cout << "指针的大小" << sizeof(*p) << endl;
cout << "指针的值" << *p << endl;
cout << "指针的地址" << p << endl;

输出

指针的大小4
指针的值10
指针的地址0078F6D8

也可以声明时赋值,和以上的结果是一样的

int* p1 = &num;

空指针

空指针,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 协议,转载请注明出处。