2018.1.15
2026.1.3
C-lang
302
1 分钟字符串的几种表示方式有什么区别? char str[6] = {"A","B","C","D","E","F"}; //"\0" 或者0 --堆栈中 局部变量
char str[] = "ABCDE"; //编译器末尾填0 常量区
char* str= "ABCDE"; //常量区
//打印
printf("%s \n",str);
//字符串打印时 遇到 0 才会停止
常用的字符串函数 1、int strlen(char* s)
返回值是字符串S的长度,不包括结束符"/0"
弊端:字符串中英文混合的话。返回的长度有问题,因为中文占用两个字节
2、char* strcpy(char* dest, char* src)
复制字符串src到dest中。返回指针为dest的值
3、char* strcat(char* dest, char* src)
将字符串src添加到dest尾部。返回指针为dest的值
4、int strcmp(char* s1, char* s2)
字符串对比,一样返回0 不一样返回非0
指针函数 本质就是函数,只不过函数的返回类型是某一类型的指针 如:
2018.1.14
2026.1.3
C-lang
60
1 分钟基本类型参数传递 int x =1;
void plus(int p)
{
p = p+1;
}
printf("%d \n",x);
//x的值是多少?
数组作为参数 编写一个函数,能够打印任意整形数组的值
2018.1.12
2026.1.3
C-lang
221
1 分钟“*”的几种用途 乘法运算符
int x = 1;
int y = 2;
int z = x * y;
定义新的类型
char x;
char* x;
取值运算符
指针类型的变量
int* a =(int*)1;
printf("%x \n",(a +1));
10: int a =(int*)1;
00401028 mov dword ptr [ebp-4],1
11: printf("%x \n",*(a +1));
0040102F mov eax,dword ptr [ebp-4]
00401032 mov ecx,dword ptr [eax+4]
00401035 push ecx
00401036 push offset string "%x \n" (0042201c)
0040103B call printf (00401070)
00401040 add esp,8
当然这里运行的时候肯定出错 因为 1 是一个异常的不存在的地址 探测 * 指针类型 的类型 int*** a;
int***** b;
int******* c;
int* d;
//int x = *(a+1);
//int x = *(b++);
//int x = *(c-5);
//int x = *(d+6);
//总结
// *加指针类型 的类型是 指针类型减去一个*
取值运算符举例 int x=1; int x =1;
int* p = &x; int* p = &x;
printf("%x %x \n",p,*(p)); int** p2 = &p;
*(p)=2; int*** p3 = &p2;
printf("%d \n",x); int r = *(*(*(p3)));
printf("%d \n",r);
2018.1.12
2026.1.3
C-lang
273
1 分钟&符号是取地址符,任何变量都可以使用&来获取地址,但不能用在常量上
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;
以上代码全都无法编译成功
说明 使用了 &符号后 将会生成 &符号后类型的指针(加一个*)
2018.1.10
2026.1.3
C-lang
893
2 分钟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;
总结:
2018.1.10
2026.1.3
linux
494
1 分钟官方教程有问题
这里总结下,省的下次又不会配了
配置 ipv6 block
打开 https://console.online.net/en/network/ 创建子网
配置 仓储地址 编辑 sources.list
sudo vim /etc/apt/sources.list
在末尾增加dhcp6的源地址
2018.1.8
2026.1.3
CSharp
2159
5 分钟上周又遇到了坑爹问题,具体表现为 服务端接口全部调用失败。 排查日志发现,有大量的 错误日志为
2018.1.7
2026.1.3
C-lang
363
1 分钟结构体数组的定义 类型 变量名[常量表达式];
//定义结构体类型
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;
结构体成员的使用 格式 :
2018.1.7
2026.1.3
C-lang
810
2 分钟#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都是全局变量,但是它们的地址却不不是连续的.
2018.1.3
2026.1.3
C-lang
603
2 分钟思考:
当需要一个容器能够存储1个字节,你会怎么做? //char 当需要一个容器能够存储4个字节,你会怎么做? //int 当需要一个容器能够存储100个2个字节的数据,你会怎么做? //short arr[100]
2018.1.1
2026.1.3
C-lang
846
2 分钟数组的定义 数组定义的格式:
数据类型 变量名[常亮]; //为什么不能使变量?
//因为在声明的时候 编译器需要知道数组的长度,分配相应大小的内存
数组的初始化 方式1:
2017.12.29
2026.1.3
linux
764
2 分钟
众所周知,Ubuntu 上官方源的更新速度一直是慢得令人发指的,很多人不得不自己编译 nginx,非常麻烦。
2017.12.28
2026.1.3
C-lang
1133
3 分钟switch语句的定义 语法 switch(表达式)
{
case 常亮表达式1:
语句;
break;
case 常亮表达式:
语句;
break;
case 常亮表达式:
语句;
break;
......
default:
语句;
break;
}
需要注意的点 表达式结束不能使浮点数 case后的值不能一样 case后的值必须是常量 break:break非常重要,当执行到一个分支后 如果没有break就会继续向下执行,遇到break才跳出switch语句default 语句与位置无关,但是当default写在其他条件的前面时。如果没有break;,就会向下继续匹配Switch语句与 if..else语句的区别: switch语句只能进行等值判断,而if..else可以进行区间判断 switch语句的执行效率远远高于if..else 在分支条件比较多的情况下,这种趋势愈发明显 观察switch语句的反汇编,看看switch语句为啥效率高
2017.12.28
2026.1.3
C-lang
454
1 分钟运算符与表达式 什么是运算符?什么是表达式? 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语言数据类型 基本类型 整数类型 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相同
int x = 123; //补码
int float f = 123.4F; //IEEE编码
int i = "A"; //神马情况???
我们在代码中写入