先定义了一个三乘三的二维数组,第一个输出的是第一行第二列所以为2,第二个输出的是第一行第三列为3,第三个为第三行第三列并且乘以-1故结果为-9。
因为int型一个占用四个字节,而a[3][2]占用了6个int型的空间,所以sizeof的结果为6*4为24,第二个printf中a[1][1]的结果为8,但是第一个是求sizeof的结果,因为是int型,故结果为4 8。第三个printf中一个是求str的sizeof结果一个是strlen结果,malloc函数申请了两个整型8个字节的位置,故sizeof结果为8,但是由于strlen遇到"\0"会停止,缺少2个字节,故结果为6。
每次使用func()函数之后,b的值都会返回,但是不会改变其结果,因为为static静态变量,故每次的结果都保留了下来,所以每次的的结果都不同,依次递增。但是静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。
A:编译预处理,B:编译阶段,C:优化和汇编过程,D:链接阶段。
编译预处理阶段:当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(#define)、文件包含(#include)、条件编译(#ifdef)等。
编译阶段:在此阶段过程中,编译器会根据我们写好的代码,以此分析其中的语句,并对当中的某些语句执行替换,该替换是直接作用于.c文件。
优化和汇编过程:由于程序员自身的问题导致的代码出现多余的操作或者效率低的指令,优化过程可以找出并自动转化为更加好的指令。
链接阶段:一个过程只编译了一个模块,而一个程序往往包括多个模块,链接程序负责将这些模块组装起来构造出最后可以执行的程序。
用 const 定义的变量的值是不允许改变的,不允许再给它重新赋值。
而第一句的p1定义一个指向字符的指针常数,即const指针,实验得知,不能修改ptr指针,但是可以修改该指针指向的内容,故(2)是错误的。
而第二句的p2定义一个指向字符常量的指针,这里,ptr是一个指向 char* 类型的常量,所以不能用ptr来修改所指向的内容,换句话说,*ptr的值为const,不能修改。但是ptr的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对ptr而言,这个值是常量。实验如下:ptr指向str,而str不是const,可以直接通过str变量来修改str的值,但是却不能通过ptr指针来修改。故(4)是错误的。
%p用来输出指针的值、输出地址符。故第一个和第三个printf输出的结果都是a对应的地址的16进制结果,而第二个和第三个由于a+1和&a+1分别是在整形数组占据的4字节中的第一个和第四个,故结果是不同的两个地址。
main函数的返回值,用于说明程序的退出状态。如果返回0,则代表程序正常退出;返回其他数字的含义则由系统决定,通常,返回非零代表程序异常退出。而argc和argv是main函数的形式参数。这两个形式参数的类型是系统规定的。如果main函数要带参数,就是这两个类型的参数;否则main函数就没有参数。