C语言15 取地址符号&的使用

&符号是取地址符,任何变量都可以使用&来获取地址,但不能用在常量上

struct Point
{
    int x;
    int y;
};
char a;
short b;
int c;
Point p;
printf("%p %p %p %p \n",&a,&b,&c,&p);
printf("%x %x %x %x \n",&a,&b,&c,&p);
printf("%x \n",&10);
16:       char a;
17:       short b;
18:       int c;
19:       Point p;
20:
21:       printf("%p %p %p %p \n",&a,&b,&c,&p);
0040D408   lea         eax,[ebp-14h]
0040D40B   push        eax
0040D40C   lea         ecx,[ebp-0Ch]
0040D40F   push        ecx
0040D410   lea         edx,[ebp-8]
0040D413   push        edx
0040D414   lea         eax,[ebp-4]
0040D417   push        eax
0040D418   push        offset string "%p %p %p %p \n" (00422e90)
0040D41D   call        printf (0040d6c0)
0040D422   add         esp,14h
22:       printf("%x %x %x %x \n",&a,&b,&c,&p);
0040D425   lea         ecx,[ebp-14h]
0040D428   push        ecx
0040D429   lea         edx,[ebp-0Ch]
0040D42C   push        edx
0040D42D   lea         eax,[ebp-8]
0040D430   push        eax
0040D431   lea         ecx,[ebp-4]
0040D434   push        ecx
0040D435   push        offset string "%x %x %x %x \n" (00422e80)
0040D43A   call        printf (0040d6c0)
0040D43F   add         esp,14h

探测 & 变量的类型

char a;
short* b;
int** c;
int x = &a;
int x = &b;
int x = &c;
以上代码全都无法编译成功

说明 使用了 &符号后 将会生成 &符号后类型的指针(加一个*)

C语言14 指针类型

C语言14 指针类型

指针是C语言中的一种数据类型,

定义带 *类型的变量

char    x;          char*       x;
short   y;          short*      y;
int     z;          int*        z;
float   f;          float*      f;
double  d;          double*     d;
Student st;         Student*    st;

总结:

结构体 字节对齐的练习

  1. 分析结构体大小
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
    
        struct S1
        {
              char c1;
              double d;
              char c2;
              char c3;
        };
        struct S2
        {
              char c1;
              char c2;
              char c3;
              double d;
        };
        struct S3
        {
              char c1;
              S1 s;
              char c2;
              char c3;
        };        

C语言 13 结构体数组

结构体数组的定义

类型 变量名[常量表达式];
//定义结构体类型
struct stStudent
{
    int Age;
    int Level;
}
//定义结构体变量
struct stStudent st;
//定义结构体数组
struct stStudent arr[10];
//或者
stStudent arr[10];

结构体数组初始化

struct stStudent{
    int Age;
    int Level;
};
struct stStudent arr[5] = {{0,0},{1,1},{2,2},{3,3},{4,4}};
//或者
arr[0].Age=100;
arr[0].Level=100;

结构体成员的使用

格式 :

C语言12 字节对齐

#include
char x;
short y;
int check()
{
    x =1;
    y=2;
    return 0;
}
int main(int argc, char* argv[])
{
    check();
    system("pause");
    return 0;
}
//上述代码中 check 函数的反汇编
13:       x =1;
00401038 C6 05 E2 55 42 00 01 mov         byte ptr [x (004255e2)],1
14:       y=2;
0040103F 66 C7 05 E0 55 42 00 mov         word ptr [y (004255e0)],offset check+26h (00401046)
//下面将y的类型改为 int
#include
char x;
int y;
int check()
{
    x =1;
    y=2;
    return 0;
}
int main(int argc, char* argv[])
{
    check();
    system("pause");
    return 0;
}
//上述代码中 check 函数的反汇编
13:       x =1;
00401038 C6 05 E4 55 42 00 01 mov         byte ptr [x (004255e4)],1
14:       y=2;
0040103F C7 05 E0 55 42 00 02 mov         dword ptr [y (004255e0)],2

我们发现,x跟y都是全局变量,但是它们的地址却不不是连续的.

C语言11 结构体

思考:

当需要一个容器能够存储1个字节,你会怎么做? //char
当需要一个容器能够存储4个字节,你会怎么做? //int
当需要一个容器能够存储100个2个字节的数据,你会怎么做? //short arr[100]

C语言10 多维数组

多维数组的定义

  1. 比如一个班有5个组,每个组有9个人

    int arr[45] 或者 intarr[5*9] 或者 int arr[5][9]

  2. 比如一个县有5个学校,每个学校有3个年级,每个年级有4个班,每个班有5个组,每个组有9个人

C语言9 数组

数组的定义

数组定义的格式:

数据类型 变量名[常亮]; //为什么不能使变量?
//因为在声明的时候 编译器需要知道数组的长度,分配相应大小的内存

数组的初始化

  1. 方式1:

C语言7 switch语句为什么高效

switch语句的定义

语法

switch(表达式)
{
    case 常亮表达式1:
        语句;
        break;
    case 常亮表达式:
        语句;
        break;
    case 常亮表达式:
        语句;
        break;
     ......
    default:
        语句;
        break;
}

需要注意的点

  1. 表达式结束不能使浮点数
  2. case后的值不能一样
  3. case后的值必须是常量
  • break:
  • break非常重要,当执行到一个分支后 如果没有break就会继续向下执行,遇到break才跳出switch语句
  • default 语句与位置无关,但是当default写在其他条件的前面时。如果没有break;,就会向下继续匹配

Switch语句与 if..else语句的区别:

  1. switch语句只能进行等值判断,而if..else可以进行区间判断
  2. switch语句的执行效率远远高于if..else 在分支条件比较多的情况下,这种趋势愈发明显

观察switch语句的反汇编,看看switch语句为啥效率高

C语言6 运算符和表达式

运算符与表达式

什么是运算符?什么是表达式?

int x,y;
x+y x-y  x>y x==y x=y

表达式的结果

(x+y)*(x-y)
char => short => int => float => double
/*如果x和 y类型 不同,最终结果按照上面结果类型转换*/

表达式不论怎么复杂。最终只有一个结果

C语言常用函数

sqrt

求给定值的平方根

sqrt() 用来求给定值的平方根,其原型为:

    double sqrt(double x);

【参数】x 为要计算平方根的值。

C语言4 -C语言整数和浮点数

C语言数据类型

基本类型

整数类型

char、short、int、long
char    8BIT    1字节     0~0xFF
short   16BIT   2字节     0~0xFFFF
int     32BIT   4字节     0~0xFFFFFFFF
long    32BIT   4字节     0~0xFFFFFFFF

特别说明:
int 在16位计算机中与short宽度一样,在32位以上的计算机中与long相同

C语言3 -变量

变量声明

变量类型 变量名;

变量类型 用来说明宽度是多大

int 4个字节
short 2个字节
char 1个字节

变量名的命名规则