书上的话,是否有矛盾。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了书上的话,是否有矛盾。相关的知识,希望对你有一定的参考价值。
http://www.fas(这部分删除)tpic.jp/images/169/5946312901.jpg
不矛盾的,情况是这样子的,如果是定义指针的时候初始化的话,可以写成如int *p = &a,
等同于:
int *p;
p = &a;
但是,如果,写成
int *p;
*p = &a;
的话,就错误了,因为类型不匹配,*p是int*类型的,&a是int类型的,编译器会报错。
改成:
int *p;
*p = a;
虽然编译可以通过,但是,运行会出现错误,因为定义*p的时候并没有初始化,而*p = a实际上是将a的值传递给p指针所指向的地址,但是,p指针所指向的地址是没有初始化的,为0xcccccc,且不可访问的,所以当程序试图访问p指针所指向的地址时,就会出现异常。
正确方法如下:
1: int *p = &a, //定义指针的时候初始化
2: int *p; //定义指针,并未初始化
p = &a; // 将a的地址传递给p,避免将值传递给未初始化的指针。此时,*p与a将绑定到一
起,即对*p进行操作,a的值也会改变。
3:int a = 10;
int b = 5;
int *p = &b; //定义指针的时候,初始化指针p指向b的地址
*p = a; //将p指针中存的值(b地址中存的值)赋值为a
注意,运行*p = a时,*p中的值,b的值都成为了5,其实就是第2种情况的一种比较特别的情况
这种方法编译和运行可以通过,但是逻辑上比较混乱,只是作为万不得已下的一个例子,请避免这种书写。
本人也系初学者,考虑可能有所不周,也不能保证自己的理解一定正确无误,共同进步吧,希望楼主采纳。 参考技术A 这个书上的意思是:
定义的时候: int *p=&a;
是可以的,因为是定义指针变量然后赋值。
而已经定义好了指针:
int *p;
然后给指针赋值的时候应该是
p=&a;
而不是
*p=&a;
综上,书上的不矛盾。追问
为啥呢。加你好友了。
追答我们说定义变量,在c语言中有两种形式,指针变量和一般变量。你至少要让电脑知道哪个是指针变量,哪个是一般变量吧。所以在前面加*符号表示定义的是指针变量。比如int *p,定义整形指针变量,这时系统已经知道p是指针变量了。
你在赋值时用的是变量名。你要注意到变量名的命名规则,是字母开头,并以数字、下划线、字母组成。也就是说p才是变量名,*p不是变量名。
你也可以理解成系统已经知道p是指针变量了,何必每次赋值时都强调呢?机器都觉得烦!
[bzoj1594]猜数游戏
主要是怎么处理矛盾
矛盾的条件有$2$种:
第一种是当把所有相等的$a$都全部找到后,他们并没有全联通,所以矛盾,因为没有两个是相同的
第二种是在2组$(l,r,a)$,$(l1,r1,a1)$中,$a<a1$并且$(l,r)$ 包含在$(l1,r1)$,矛盾
所以怎么去维护,第一种直接暴力查询,第二种我们可以从大到小排序$minn$,去在线段树中维护并集操作,看一看是否被覆盖即可
此答案具有单调性,所以可以通过二分优化
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define int long long using namespace std; inline int read() { int f=1,ans=0;char c; while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){ans=ans*10+c-‘0‘;c=getchar();} return f*ans; } struct node{ int l,r,minn; }x[10000001],st[10000001]; int flag[8000001],n,q,maxn,inf=(int)1<<61; bool cmp(node x1,node x2){return x1.minn>x2.minn;} void pushdown(int k,int l,int r){ if(!flag[k]) return; flag[k<<1]=flag[k<<1|1]=1; flag[k]=0;return; } void update(int k,int l,int r,int x,int y){ // cout<<x<<" "<<y<<endl; if(x<=l&&r<=y){flag[k]=1;return;} pushdown(k,l,r); int mid=l+r>>1; if(x<=mid) update(k<<1,l,mid,x,y); if(mid<y) update(k<<1|1,mid+1,r,x,y); flag[k]=flag[k<<1]&flag[k<<1|1]; return; } int query(int k,int l,int r,int x,int y){ if(x<=l&&r<=y) return flag[k]; pushdown(k,l,r); int mid=l+r>>1; int kkk=1; if(x<=mid) kkk&=query(k<<1,l,mid,x,y); if(mid<y) kkk&=query(k<<1|1,mid+1,r,x,y); flag[k]=flag[k<<1]&flag[k<<1|1]; return kkk; } bool check(int len){ // cout<<"len:"<<len<<endl;return 0; memset(flag,0,sizeof(flag)); for(int i=1;i<=len;i++) st[i]=x[i]; sort(st+1,st+len+1,cmp); int j; for(int i=1;i<=len;i=j+1){ j=i; while(j<=len&&st[j].minn==st[i].minn) j++;--j; int l1=inf,r1=inf,l2=0,r2=0; for(int k=i;k<=j;k++){ l1=min(l1,st[k].l);l2=max(l2,st[k].l); r1=min(r1,st[k].r),r2=max(r2,st[k].r); } if(l2>r1) return 0; if(query(1,1,n,l2,r1)) return 0; update(1,1,n,l1,r2); }return 1; } signed main() { n=read(),q=read(); for(int i=1;i<=q;i++) { x[i].l=read(),x[i].r=read(),x[i].minn=read(); } int l=1,r=q,mid; while(l<=r){ mid=l+r>>1; if(check(mid)) maxn=max(maxn,mid),l=mid+1; else r=mid-1; } if(maxn!=q) cout<<maxn+1; else cout<<0; }
以上是关于书上的话,是否有矛盾。的主要内容,如果未能解决你的问题,请参考以下文章
辩证法和形而上学的根本对立焦点在于:是否承认事物的内部矛盾是事物发展的动力