1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

// 写一个打印数组的方法
void print(int* arr,int length){
// 获取数组的大小
for (int i = 0; i < length; i++)
{
printf("%d ",arr[i]);
}
}

struct MyStruct
{
char* name;
};

typedef struct MyStruct Student;// 给 MyStruct 取一个别名叫做 Student

// int32_t ,可以对基本数据类型取别名
typedef int int32;

//数组作为参数传递
/*void main(){
int a;// 告诉c和c++编译器开辟一块连续大小的 4 字节的内存空间
int arr[] = {1,2,3,4,5,6};
// 求数组的大小?
int size = sizeof(arr) / sizeof(int);
printf("size = %d\n",size);
print(arr,size);//数组作为参数传递,会退化成为一个指针,传递的是首地址,所以必须传递数组的长度过去,否则无法打印数组
getchar();
}
//数据类型分析

void main(){
int a;// 告诉c和c++编译器开辟一块连续大小的 4 字节的内存空间
int arr[] = { 1, 2, 3, 4, 5, 6 };// arr 数据类型的内存大小空间 24

a = 10;

// 12 , 16 , 12 , 36 36?
printf("%d, %d, %d ,%d", arr, arr+1, &arr, &arr+1);


getchar();
}
// 2.数据类型剖析
// 数据类型的本质:一块连续大小的内存空向
// 数据类型的别名:int32_t
// void指针数据类型:vid"代表任意的数据类型的指针
// 3.变量的本质
// 变量的本质:固定内存块大小(一块连续大小的内存空向) 的别名,通过变量可以去操作一块内存上的数据变量的三要素:内存大小,名称,作用域
void main(){
Student stu = { "Darren" };

int32 number1 = 100;

printf("number1 = %d",number1);

// 获取 Bitmap ,锁定画布 void**
// void number;// 错误

// memcpy();// 拷贝内存,什么用 void*

getchar();
}


char* getStr1(){
char* str = "12345";
return str;
}

char* getStr2(){
char* str = "12345";
return str;
}

char* getStr3(){
char buff[128];

strcpy(buff,"12345");

return buff;
}

char* getStr4(){
char* buff = malloc(128); // char* buff char* 是四字节的数据类型,存的是堆区开辟的 128 个字节的首地址
strcpy(buff, "12345");

return buff;
}

void main(){

char* str1 = NULL;

char* str2 = NULL;

str1 = getStr1();

str2 = getStr2();

char* str3 = getStr3();

char* str4 = getStr4();

printf("%d , %d, %s, %s",str1,str2,str3,str4);// str3 = 12345

getchar();
}
*/


void main(){
int a = 10;

int b = 10;
// 0508 , 0496 a 的地址要大于 b 的地址 (debug)
// 016 , 020 a 的地址要小于 b 的地址 (release)
// buffer 数据类型跟栈的开口方向无关(都是向上)

char buff[10];
// buff+1 > buff
printf("%p , %p, %p, %p",&a,&b,buff,buff+1);

int a = 100;
int* ff = &a;// 虽说是 a 的地址,但是我也可以把 ff 看做一个数组

// char** 二维数组 char** 二级指针

ff += 1;

getchar();
}
// 理解指针的关键还是在于内存 ,指针的大小是 4 字节 int* double* 指针存放的是一块内存的地址 4 字节 ,但是也会有数据类型

4.1 程序运行的流程:

1
2
3
4.1.1操作系统会把物理硬盘上的代码 load 到内存
4.1.2加载到内存后会把c代码分成4个区
4.1.3然后系统会找到main 函数的入口去执行

4.2 四驱模型:

1
2
3
4
4.2.1栈区:由编译器自动分配的,存放一些局部变量值和函数,这个里面内存是会自动进行回收的
4.2.2 堆区:一般都是由我们自己去开辟的,这个里面的内存需要手动进行释放 malloc free new delete
4.2.3 全局区:静态的一些常量,字符串等等
4.2.4程序代码区:存放的是函数体的二进制代码

p65-p76没看,讲的c进阶,有点懵不如后面自己看c的完整教程