关于如何理解和运用C语言的指针,我有话说(以C++内的纯C风格解题代讲)

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于如何理解和运用C语言的指针,我有话说(以C++内的纯C风格解题代讲)相关的知识,希望对你有一定的参考价值。

使用指针时的两点

想写好纯C风格的代码,那指针肯定少不了。。

  • 纯C风格对数组的函数可编程性操作,只能用指针这玩意,而使用指针的方式一般要注意以下几点:
  1. 注意指针指向的是谁,这方面以防一些憨憨直接用 int** 指针来接二维数组的首地址来操作,由于二级指针指向的是一级指针 int* 所以,每次加法运算时加的是一个int*的大小,而指针的大小都是4字节,而二维数组实际上需要加上 int[col] 类型长度,所以使用二级指针前,请先使用一级指针数组把行的首地址存下来。
  2. 注意所操作的地址是否有内存,为什么这么说呢?比如你申请了一片连续的 int*3 大小的内存,给指针变量赋值为它的首地址之后,你只能正常操作 [0]、[1]、[2] 三个空间。相应的我们需要注意的还有是否有内存可供操作,毕竟指针变量存储的都是各个类型的内存块的地址,比如你所操作的对象的内存已经到达了生命周期,那么你的操作肯定就是无效的,所以就出现了动态分配内存,这样分配的内存是不会自动回收的,只要你能找到地址就能进行使用,这也就出现了一个很大的问题:内存管理需要手动进行操作。故这就是C\\C++一直没去解决的痛点!

以题代讲

在这里插入图片描述

解题代码

由于纯C风格,所以内存开支格外的少
image.png

class Solution {
public:
const int INF = 0x3f3f3f3f;
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
    //这里先静态分配的各个内存空间(毕竟解题只需要返回一个答案,所以内存空间的生命周期只需要在这个函数未结束前存在即可(故不用动态分配内存))
    bool visit[n+1];int dist[n+1][n+1];int mp[n+1][n+1];
//给分配的内存空间开始赋初值
        memset(visit,0,sizeof visit);memset(mp,0x3f,sizeof mp);
        visit[k] = true;
        memset(dist,0x3f,sizeof dist);
        start = k;
//开始利用指针操作二维内存空间。
        int** dists;int* d[n+1];
        for(int i=0;i<=n;i++)d[i] = dist[i];
        dists = d;

        //初始化邻接矩阵
        for(auto&&t: times){
            mp[t[0]][t[1]] = t[2];
        }
        //进行搜索更新
        dists[k][k] = 0;
        for(int i=1;i<=n;i++){
            if(mp[k][i]!=INF){
                dists[k][i] = mp[k][i];
            }
        }
        while(1){
            int f = findMin(n,dists,visit);
            if(f==start)break;
            visit[f] = true;
                for(int i=1;i<=n;i++){
                    if(mp[f][i]!=INF&&!visit[i]){
                       dists[start][i] = min(dists[start][i],mp[f][i]+dists[start][f]);
                }
            }
        }
        int res = 0;
        for(int i=1;i<=n;i++){
            res = max(dists[start][i],res);
        }
        return res!=INF?res:-1;
    }
private:
int start;
//用于找到未被标记的最小的那个结点
    int findMin(int n,int **dists,bool *visit){
        int nmin = start;
        int dist = INT_MAX;
        for(int i=1;i<=n;i++){
            if(!visit[i]&&dists[start][i]!=0x3f3f3f3f){
                if(dist>dists[start][i]){
                    dist = dists[start][i];
                    nmin = i;
                }
            }
        }
        return nmin;
    }
};

以上是关于关于如何理解和运用C语言的指针,我有话说(以C++内的纯C风格解题代讲)的主要内容,如果未能解决你的问题,请参考以下文章

C语言中关于指针的学习

c语言关于链表中指针的运用有一个疑问

51单片机C语言编程问题,关于指针的运用问题,菜鸟求解求。

关于C语言指针的问题

C++ | 关于引用的一个细节

您对 C、C++ 和 Java 中的指针、引用和句柄有啥深刻的理解?