none
VC2010支持C语言哪个标准,另有关C语言指针的问题? RRS feed

  • 问题

  • 我所知道的C语言有K/R78,ANSI90,ANSI94,ANSI99,(另还有ANSI2009吗?)

    VC2010是支持哪个C语言版本。

    有一些问题好奇怪。比如:

    char ch1='a',ch2;

    char *cp=&ch1;

    说表达式*(cp+1),如果做为右值为ch1地址的后一个地址的值,如果做为左值是ch1地址的后一个地址

    而事实是:

      像 *(cp+1)=&ch1;这样的语句,VC2010就会报错,说不能把char *类型的值分配到char 类型的实体,

    但是同样的程序放到WIN TC (v2002-2005)下编译可通过运行

    我发现VC像上面这样*(cp+1)的指针还有其它一些例子如*CP不管左值还是右值,都是代表char类型的值,而不是书上说的在左值的时候是地址,在右值的时候是值。

    不知是书上的版本和现在有冲突还是我的理解问题?

    请各位DX指教!附代码:

    #include <stdio.h>
    int main( void )
    {
     char ch1='a',ch2='b';
     char *cp=&ch1;
     *cp=&ch2;  //出错,如果按书上说*CP在左值时,是代表地址,在右值时才是值,那为什么不能把ch2的地址给*CP
     *(cp+1)=&ch2;  //同样出错
     printf("%p",&ch2);
     printf("%p",*cp);
     getch();               //同样是VC2010学习版,我个函数在XP下可以用,在WIN7 64下不能用,为什么?
    }

    2010年7月27日 13:21

答案

全部回复

  • *(CP+1)这样的指针表达式做为左值时,代表的是地址还是值?
    2010年7月27日 13:55
  • 没人知道吗?

    2010年7月28日 7:41
  •  
     
    2010年7月28日 15:43
  • 谢谢楼上DX,是内存位置而不是内存地址,重新看了一下,这样好理解多了。

    2010年7月29日 1:59
  •  
     
    2010年7月29日 5:20
  • 段选择子和描述符
    (*(pT + n))可看作一个T类型的变量名pTn。
    一个变量名代表一个实体, 一个实体是一块内存, 这块内存有位置(地址), 有大小(由类���决定有多少字节), 有值(这地址上这么多字节的内存内容),
    有属性(如果是const变量是"只读"属性).
     


    (*(pT + n))可看作一个T类型的变量名pTn,这是什么意思,什么叫T类型的变量,pT不就是一个变量吗

    *(pT + n)我的理解是指针pT后n个位置的值(当做右值时)

    ���这是什么意思呀,是网页不能显示出来吗,类的类型?

    ��是指 寄存器?

    一个变量内存是否就是一个“存储段”

    在C语言中,对变量内存控制的背后是否就是用到“段选择子和描述符”,描述符子TYPE占用4位,它用于说明存储段的属性,其中位1就是说明该段是否可写,这就是变量属性的背后吗。

    段界限用于表示变量的大小,基地址就是变量地址?

    感觉好象又不是,一个段可以很大很大,但一个字符变量的内存空间只有一个字节。

    C语言是否提供直接操作段选择子和描述符的指令,有介绍这方面的书籍资料吗?

     

    2010年7月30日 5:09
  • 哦,我想知道编译器如何定位一个变量在电脑中的实际内存?

    它先找到这个程序入口地址,再通过偏移找到数据段?再根据变量申明在数据段中找到变量的实际位置?

    还有那个函数的可变参数,看了对这个概念还是不好理解。

    2010年8月2日 0:53
  •  
     
    2010年8月2日 17:17
  • 好复杂,先把C学了再说
    2010年8月4日 7:08
  • ?/????
    2010年8月8日 7:27