书上的话,是否有矛盾。

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;
}
View Code

 

以上是关于书上的话,是否有矛盾。的主要内容,如果未能解决你的问题,请参考以下文章

继承默认构造函数,矛盾吗?

关于requirejs和grunt压缩合并是否矛盾

辩证法和形而上学的根本对立焦点在于:是否承认事物的内部矛盾是事物发展的动力

用 $.ajax 提交表单是不是矛盾?

ILC_COLOR32 图像列表中的图像是不是经过 alpha 预乘?我收到相互矛盾的信息

dotenv 是不是与十二要素应用程序相矛盾?