Q1.为什么C针有类型,因为指针是储存地址空间,在32位机上,就是4个字节来存储的,那为什么不直接就是long int型?而还有其他类型呢?2008-9-12
An:答案见Q5。
Q2:指向函数的指针是什么意思?(陌生)2008-9-12
An:虽然函数不是变量,但是在内存中还是有函数入口,整个入口就是函数的地址,既然是函数地址就有函数指针。
Q3:什么是声明?什么是定义?
An:定义只能出现一次,确定对象的类型,并为其分配内存;声明可以初次出现,可以在不同文件中出现,意思是在不同文件中也可以引用它。Extern
Q4:什么是左值?什么是右值?
An:左值是地址,右值是地址的内容。每个符号在编译的时候的地址都是知道的。
Q4:请问,++x与x++有什么区别?
An:++x是先增加x的内容,然后取值放在内存;x++是,取x的地址,其值装在到寄存器中,然后内存的数值增加。可以这样理解,这些操作符号都是对变量的拷贝,前缀表示拷贝之前变量的值增加,后缀表示,拷贝后对变量的增加。(理解其机制,或者其本质原理)
Q5:指针就是地址,在32位机器,就是4字节的地址信息,就是int型,那么为什么指针还有类型呢?——指针的类型(int 为4字节,在不同机器,不同编译器是不一样的)
An:因为只有知道指针的类型,才能参与操作,如*P++,如果是char类型就加一个字节,以此类推……,如果,不知道类型的话,其参与的运算就不知道去哪里了。(也许这也是指针特别之处吧!)
Q6:在编译过程中单引号和双引号的区别?
An:单引号在使用中代表只是一个整数;双引号代表的是指向无名数组的指针,以”\o”初始化结尾。(字符串)
Q7:void *p()与void (*p)()的区别?
An:()的优先级比*高,所以*p()等效于*(p()),是一个函数,返回值为void类型;
后者是指向该函数的指针。(或者说,一个是指向该函数,一个指向该函数的返回值。)
好,那如果,你还是不理解,前者是p()是函数,(void*)是指针,既返回值为指针;
后者(*p)指针,然后返回值为void,只是指向该函数的指针。
Q8:如何理解数组?
An:对数值要又指针的概念,对数组下表的操作其实都是通过对指针的操作来实现的。另外要特别注意理解两点:1.C语言只有一维数组,其他数组都是由其一维数组构成;2对数组的操作就是对数组大小的确定,以及获得数组下标为0的指针。
Q9:如何理解表达式子“*”关于指针的用法?(某些部分还需要了解计算机的结构)
An:如*p,指针p的值是内存特定位置的地址,*就是让指针指向该地址。如果*p是左值,就是对该地址的值进行修改;如果是右值,则是取该地址的值。(计算机需要一套系统,就是取地址的寄存器,然后按照寄存器的值找到相应的地址,然后去数据,送到AMU运算。