今天给大家重温一下,c语言中指针的特点。

直接上代码:

#include<bits/stdc++.h>

using namespace std;

int a[2];

int main()
{
int *b=a;//传入的是地址,所以会改变原来的值
for(int i=0;i<=1;i++)
{
cout<<b[i]<<endl;
b[i]++;
}
for(int i=0;i<=1;i++)
{
cout<<a[i]<<endl;
a[i]++;
}

}

运行结果:

C语言之指针再体会_指针特点

由于a的地址传给了指针b,因此,当b指针进行访问和操作后,再遍历a数组时,其中的元素值,也会发生改变。

很简单对吧? 那么请看这道题以及这串代码:

例题:

C语言之指针再体会_指针特点_02

代码:

#include<bits/stdc++.h>

using namespace std;

int du[10005];
vector<int>p[10005];
int main()
{
int n,m;
cin>>n>>m;
while(m--)
{
int a,b;
cin>>a>>b;
p[a].push_back(b);
p[b].push_back(a);
du[a]++;
du[b]++;
}
cout<<endl;
cout<<"++++++++++"<<endl;
cout<<"初始du各个结点的度数:"<<endl;
for(int i=1; i<=n; i++)
{
cout<<i<<":"<<du[i]<<endl;
}
cout<<endl;
int k;
cin>>k;
while(k--)
{
int *du2=du;//这里就是指针*
int np;
cin>>np;
for(int i=1; i<=np; i++)
{
int x;
cin>>x;
du2[x]=0;
for(int j=0; j<p[x].size(); j++)
{
if(du2[p[x][j]]!=0)
du2[p[x][j]]--;//原因在此!!!!*
}
}
cout<<endl;
cout<<"++++++++++"<<endl;
cout<<"du2变化后,du各个结点的度数:"<<endl;
for(int i=1; i<=n; i++)
{
cout<<i<<":"<<du[i]<<endl;
}
for(int i=1; i<=n; i++)
{
if(du2[i]>0)
{
cout<<"NO"<<endl;
goto k;
}
}
cout<<"YES"<<endl;
k:
;
}

return 0;
}

随后,带入测试数据:

10 11
8 7
6 8
4 5
8 4
8 1
1 2
1 4
9 8
9 1
1 10
2 4
5
4 10 3 8 4
6 6 1 7 5 4 9
3 1 8 4
2 2 8
7 9 8 7 6 5 4 2

运行结果:

C语言之指针再体会_指针特点_03

我们会发现,du2的变化,导致了du的变化。为什么呢?原因我在一开始已经给出,就是指针的特点所致。

总结,当代码一复杂,可能原来简单的问题也不好找出来,所以c语言基础要打好,不然会像我这次一样,望着复杂的代码debug小问题~