本人很菜,决定先学下指针最简单的使用,便于调用函数

相关概念

指针变量的声明

指针变量的声明需要指定变量类型和指针所指向的数据类型,例如:

1
2
3
int* p;     // 声明一个指向整型变量的指针变量p
char* q; // 声明一个指向字符型变量的指针变量q
float* r; // 声明一个指向浮点型变量的指针变量r

取地址符& 指针运算符*

**&**是取地址符,可以用来获取变量的内存地址。例如:

1
2
3
int a = 10;
int* p;
p = &a; // 将a的地址赋值给指针变量p

**是指针运算符,可以用来获取指针所指向的变量的值*,也可以用来修改指针所指向的变量的值。例如:

1
2
3
4
int a = 10;
int* p = &a;
printf("%d\n", *p); // 输出10,表示指针p所指向的变量的值
*p = 20; // 修改指针p所指向的变量的值为20

指针的运算

指针可以进行加减运算,指针加上一个整数n的结果是指针指向的地址加上n倍指针所指向变量的大小。例如:

1
2
3
int a[5] = {1, 2, 3, 4, 5};
int* p = &a[0];
p += 2; // 指针p指向数组a的第3个元素a[2]

指针的类型转换

指针变量的类型可以通过强制类型转换进行改变。例如:

1
2
3
int a = 10;
int* p = &a;
char* q = (char*)p; // 将指向整型变量a的指针p转换成指向字符型变量的指针q

需要注意的是,指针类型的转换可能会丢失精度或导致错误,应谨慎使用。

调用函数返回多个结果

使用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <bits/stdc++.h>
using namespace std;

int multy(int a, int b, int* res, double* mid)
{
int sum =0;
sum = a + b;
*res = sum;//res存的是地址 *res和sum才是同一级
*mid = sum/2.0;
return 0;
}

int main()
{
int a,b,res;
double mid;
cin >> a >> b;
multy(a,b,&res,&mid);//输入实参 取地址运算
cout << res << ' ' << mid << endl;
return 0;
}

数组指针

数组指针(Pointer to array)是指向数组的指针变量。和普通指针不同的是,数组指针在声明时需要指定指针所指向的数组类型和数组的维数。

数组指针的声明语法如下:

type (*ptr)[size];

其中,type是数组元素的类型,ptr是指针变量的名称,size是数组的维数。例如,下面是一个指向int类型、维数为3的数组的指针变量的声明:

1
int (*ptr)[3];

注意

  1. 数组指针可以指向任何维数的数组,但是数组指针的类型必须和它所指向的数组的类型和维数一致,否则会出现类型不匹配的错误。

  2. 使用数组指针访问数组元素时,需要使用指针运算符和下标运算符。例如,要访问数组a中第i行第j列的元素,可以使用以下语法:

    1
    *(*(a+i)+j)
  3. 数组指针可以用于函数参数传递。例如,可以将一个指向int类型数组的指针变量作为函数参数传递给一个函数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <bits/stdc++.h>
    using namespace std;

    void func(int (*ptr)[3], int* x, int* y, int* z)
    {
    // 访问数组元素
    *x = (*ptr)[0] + 1;//为了区分,我们再做一点运算
    *y = (*ptr)[1] + 1;
    *z = (*ptr)[2] + 1;
    }

    int main()
    {
    int x,y,z;
    int a[3] = {1, 2, 3};
    int (*ptr)[3] = &a;//数组指针
    func(ptr,&x,&y,&z);
    for(int i=0; i<3; i++)
    {
    cout << (*ptr)[i] << ' '; //指向数组元素
    }
    cout << endl;
    cout << x << ' ' << y << ' ' << z << endl; //访问并进行运算后返回的值
    return 0;
    }
    1
    2
    1 2 3 
    2 3 4

使用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <bits/stdc++.h>
using namespace std;

void sumfun(int* p, int len, long long* res)
{
long long s = 0;
for(int i=0;i<len;i++)
{
s = s + p[i];//也可以写 s = s + *(p+i)
}
*res = s;//res指向&res *res保存答案
}

int main()
{
long long res;
int a[100];
memset(a,-1,sizeof(a));//数组初始化为-1
sumfun(a,100,&res);//a表示数组元素首地址
cout << res << endl;
return 0;
}
1
-100

这下可以随便封装、调用函数了