关于如何理解和运用C语言的指针,我有话说(以C++内的纯C风格解题代讲)
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于如何理解和运用C语言的指针,我有话说(以C++内的纯C风格解题代讲)相关的知识,希望对你有一定的参考价值。
使用指针时的两点
想写好纯C风格的代码,那指针肯定少不了。。
- 纯C风格对数组的函数可编程性操作,只能用指针这玩意,而使用指针的方式一般要注意以下几点:
- 注意指针指向的是谁,这方面以防一些憨憨直接用
int**
指针来接二维数组的首地址来操作,由于二级指针指向的是一级指针int*
所以,每次加法运算时加的是一个int*的大小
,而指针的大小都是4字节,而二维数组实际上需要加上int[col]
类型长度,所以使用二级指针前,请先使用一级指针数组把行的首地址存下来。 - 注意所操作的地址是否有内存,为什么这么说呢?比如你申请了一片连续的
int*3
大小的内存,给指针变量赋值为它的首地址之后,你只能正常操作[0]、[1]、[2]
三个空间。相应的我们需要注意的还有是否有内存可供操作,毕竟指针变量存储的都是各个类型的内存块的地址,比如你所操作的对象的内存已经到达了生命周期,那么你的操作肯定就是无效的,所以就出现了动态分配内存,这样分配的内存是不会自动回收的,只要你能找到地址就能进行使用,这也就出现了一个很大的问题:内存管理需要手动进行操作。故这就是C\\C++一直没去解决的痛点!
以题代讲
解题代码
由于纯C风格,所以内存开支格外的少
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风格解题代讲)的主要内容,如果未能解决你的问题,请参考以下文章