zoukankan      html  css  js  c++  java
  • C语言基础知识点

    整理记录一些C语言知识点;

    更新中...

    1.左值,右值

    常见的一个错误,

    int a[10];
    printf("%d",&(a+1));
    eror C2102:'&'requires L-value

    就是说运算符&需要一个左值类型的变量;

    左值,即可以放在等号左边的值,即内存地址;

    右值,即可以放在等号右边的值,即变量的值或表达式;

    下面这个翻译的很好,

    L-value中的L指的是Location,表示可寻址。Avalue (computer science)that has an address.
    R-value中的R指的是Read,表示可读。in computer science, a value that does not have an address in a computer language.

    上面例子中的,(a+1)计算后是一个数值,而&a是正确的,a是一个有确定地址的数组,a是一个内存的地址;

    另外,&a+1,表示的是...对整个数组加1;

    另外...

    还有一个经典的笔试题...
    void main()
    {
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);
    printf("%d,%d",*(a+1),*(ptr-1));
    }
    输出为 2,5
    a与&a的值是一样的,但含义不一样,
    a表示数组的首地址,即&a[0],对第一个元素取地址,&的对象是元素,所以a+1,即&a[0]+1,偏移一个sizeof(int);
    &a表示对数组进行取地址运算,&的对象是数组,所以&a+1是指下一个对象的地址,即数组(对象)后加1,相当于a[5];
    而指针变量 ptr指向a[5],所以*(ptr-1),(ptr-1)就是a[4],所以*(ptr-1)为5;
    如果数组a的地址是 0x0000,那么a+1是0x0000+sizeof(int),&a+1是0x0000+5*sizeof(int)

    从这里也可以看出来....操作符*要加右值运算;
    下面附张操作符的运算表,

     

  • 相关阅读:
    Linuxqq shell脚本安装后的卸载
    A Spy in the Metro UVA-1025(dp)
    L1-064 估值一亿的AI核心代码
    龙芯 3A4000 安装 Debian10 (via debootstrap)
    Linux用户和用户组
    /etc/issue、/etc/issue.net和/etc/motd的区别
    一种注释
    龙芯平台51单片机开发环境搭建笔记
    Rails UVA-514 (stack)
    The SetStack Computer UVA-12096 (set 操作)
  • 原文地址:https://www.cnblogs.com/jamesnt/p/3667579.html
Copyright © 2011-2022 走看看