1.打印二进制机器码(分别表示32位的和64位的)
#include <stdio.h>
/*按照8位的长度打印一个数值*/
void dis8bit(char val)
{
int bit = 8;
while(bit--)
{
if(1<<bit&val){
printf("1");
} else {
printf("0");
}
if(!(bit%4))
printf(" ");
}
putchar(10);
}
/*按照32位长度打印数值的机器码*/
void dis32bit(int val){
int bit = 32;
while(bit--){
if(1<<bit&val){
printf("1");
} else {
printf("0");
}
if(!(bit % 4))
printf(" ");
}
putchar(10);
}
int main(void)
{
int a = -1,b = -128,c = 127,d = 0;
dis8bit(a);
dis8bit(b);
dis8bit(c);
dis8bit(d);
int e = 127;
dis32bit(e);
return 0;
}
2.关于程序内存。
Bss区的生命周期是从程序的开始到程序的结束。
3.关于数据在内存中的存储
int a;全局变量,并且未初始化,所在在数据段的bss区。被初始化为0
static int b; 静态全局变量,数据段的bss段,在bss区。
int c[10] = {1,2,3,4}; 全局的数组在data段,这里的数据在运行的时候会被拷贝来的。
4.大端存储和小端存储引起的问题
在内存中的分析如下:
5.数据类型 * 指针变量
指针变量,本质同普通变量。
* 指明后面的变量为指针变量
数据类型指明,从该变量存放的地址处的寻址能力。
char *p; 代表了从p这个地址处的寻址能力是1个字节,(因为char *类型的寻址能力为1个字节)。
指针的一个重要概念 步长 = 数据类型的大小
int a[10]等价于==》int[10] a;
6.关于typedef关键字
typedef int ARRAY[10]; 给数组定义别名
给参数起别名的步骤:
再如:
void (*p)(int,int);的别名为:typedefvoid (*pp)(int,int);这个时候pp就是指针函数的别名。
7.数组:
数组访问的方式有:
A:下标法,特例列举:
这里说明,如果想得到一个数组的值也可以通过i[a]è下标[数组名]的方式得到
B:偏移法的方式取数值,举例:
C:指针法
*p++ 《==》*(p++)
8.数组局部初始化
9.#if-0-#endif排除某段代码影响
10.数组求大小
求作为函数参数传递的数组名的大小:
11.括号表达式
分析:int xx[3][2] = {(1,2),(3,4),(5,6)};实际上等价于:intxx[3][2]={2,4,6};
内存分析: