%lu输出32位无符号整数,sizeof求出int型t的数据长度为4,\012 是一个字符, 数值为8进制的 012,\xa1 是一个字符,数值为16进制的 a1,故一共是10个字符,再加上‘/0’得到11,所以结果为4,11。
由于是’,‘号运算符,所以先计算,得到c=60,b=60*20=1200,得到结果为1200 60
输出a+b+c的值为1200+60+10为1270,又因为有5个字符,故得到结果为1270 5
主函数中的指针变量str指向NULL(空指针), 在传进函数 get_str 时将 ptr 指向的内存地址变为了malloc所申请的空间, 而主函数中的str仍指向NULL无法输出字符。
size_t (*p(char *str))(size_t a)
是一个返回值为函数指针的函数,首先看 p ,因为()的优先级比*高,所以p先与()结合,
p(char *str)
是含有字符型指针参数的函数,返回值是size_t (*)(size_t a),也就是一个指向函数的指针.该指针指向的函数有size_t类型的参数.
非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。所以区别就在于static全局变量只初使化一次防止在其他文件单元中被引用,而普通局部变量能够在其他文件单元也被引用。
一般,省略第一维的定义时,第一维的大小按如下规则确定:初值个数能被第二维整除,所得的商就是第一维的大小;若不能整除,则第一维的大小为商再加1。所以为[4][2],得到第一次输出0为以第一个0,第二次输出0为第四个0,第三次输出0为默认输出值0。
第一个是一个char *型的变量,加上const使得其指向的内容变得不可变,使得p指向的内容无法被改变。第二个与第一个同类型。
第三个const修饰的p,导致p不可改变,但是p指向的内容可以改变。
第四个结合了前两种,使得既不能改变p指向的地址值不能更改,其内容值也不能能更改。
#include< >引用的是编译器的类库路径里面的头文件。并且用来包含标准头文件(例如stdio.h或stdlib.h).
#include“ ”引用的是你程序目录的相对路径中的头文件。而且用来包含非标准头文件。
而#include是为了声明在这个地方插入别的文件中的代码。
for语句先定义了a为1,故在switch语句中输出第三个printf的结果b is 2,第二次循环a为2,故输出第一个printf的结果c is 5,第三次循环a为3,所以从default开始运行,结果为a is 3和b is 2。
int类型的最高位表示正负,如果最高位是1,则表示负数。而unsigned int的最高位是有效数位。当int和unsigned in相加时,要将int转化为unsigned int,而int小于0,所以它的最高位是符号位,为1,所以转化的结果是一个很大的正数。所以if语句为真,输出第一个printf的结果为a+b=-10。
第一个输出num数组的首地址加一得到第二个数值为4,又因为&a是整个数组的首地址,而a是数组首元素的首地址。所以输出*(ptr-1)为整个数组-1的结果为10,所以输出结果为4,10。
stdout – 标准输出设备 (printf("…")) 同 stdout。
stderr – 标准错误输出设备 两者默认向屏幕输出。
字符型最大数据为8位二进制为255,又因为int为4B,导致过大,而Linux小端机从右侧取8位,所以转义后结果为‘\0’,又因为字符型接收数据时,后面直接跟数字将转化为ascii码表对应的数据。
void swap(int mold, void* _x, void* _y) {
if (mold == 1)
{
int* p1, * p2, tmp;
p1 = (int*)_x;
p2 = (int*)_y;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
else if (mold == 2) {
double* p1, * p2, tmp;
p1 = (double*)_x;
p2 = (double*)_y;
tmp = *p1;
*p1 = *p2;
*p2 = tmp;
}
}
先得到该函数的类型再进行分类运算。
在Linux平台上是1,在Windows平台上是2,IOS上是3,其他的平台上是4,可以快速分不同平台来运行程序。
memset() 的作用是在一段内存块中填充某个给定的值。因为它只能填充一个值,所以该函数的初始化为原始初始化,无法将变量初始化为程序中需要的数据。用memset初始化完后,后面程序中再向该内存空间中存放需要的数据。且在结构体中不同类型要对其,对于char然后short型会补1位,所以为char 空 short short int int int int排列,又因为定义了值,所以为0300050007000000颠倒过来再四字节和八字节输出得到327683和30065098775。
C99规范的gcc编译器有__VA_ARGS__这个宏,将可变参数转化为字符串之后,又因为-1在short中得到16个1,得到ffff,在char和short型中,会因为符号类型发生改变,整体变为ffffffff,所以得到x1:ffffx2:ffffffffx3:ffffffff
编译预处理,编译阶段,优化和汇编过程,链接阶段,在编译预处理阶段:当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(#define)、文件包含(#include)、条件编译(#ifdef)等。在编译阶段:在此阶段过程中,编译器会根据我们写好的代码,以此分析其中的语句,并对当中的某些语句执行替换,该替换是直接作用于.c文件。在优化和汇编过程:由于程序员自身的问题导致的代码出现多余的操作或者效率低的指令,优化过程可以找出并自动转化为更加好的指令。在链接阶段:一个过程只编译了一个模块,而一个程序往往包括多个模块,链接程序负责将这些模块组装起来构造出最后可以执行的程序。
转载链接:memset函数
__VA_ARGS__用法