包含标签 C articles

C语言22 调用约定和函数指针

函数调用约定 就是告诉编译器:怎么传递参数,怎么传递返回值,怎么平衡堆栈 int method(int x,int y) { return x+y; } //调用 method(1,2); 常见的几种调用约定: 调用约定 参数压栈顺序 平衡堆栈 __cdecl 从右至左入栈 调用者清理栈 __stdcall 从右至左入栈 自身清理堆栈 __fastcall ECX/EDX 传送前两个,剩下:从右至左入栈 自身清理堆栈 int __stdcall method(int x,int y) { return x+y; } //调用 method(1,2); //观察反……

Continue reading

C语言21 指针数组与数组指针

指针数组的定义 char arr[10]; //10 char char* arr[10]; //10 指针(char*) Point* arr[10]; //10 指针(Point*) int******** arr[10]; 指针数组的赋值 char* a = "Hello"; char* b = "World"; //方式1: char* arr[2]= {a,b}; //方式2: char* arr[2]; arr[0]=a; arr[1]=b; 结构体指针数组 struct Point { int x; int y; } Point p; //8字节 一个结构体 Point arr[10]; //8字节 * 10 结构体数组 Point* arrPoint[10]; //4字节 * 10 结构体指针数组 分析下面的代码 int arr[] = {1,2,3,4,5,6,7,8,9,0};……

Continue reading

C语言20 结构体指针

探测结构体指针的特性 struct Point { int x; int y; } ++、– 加法与减法 指针相减 使用结构体指针 //创建结构体 Point p; p.x=10; p.y=20; //声明结构体指针 Point* ps; //为结构体指针赋值 ps = &p; //通过指针读取数据 printf("%d \n",ps->x); //通过指针修改数据 ps->y=100; printf("%d\n",ps=>y); 结构体指针一定要指向结构体吗? struct Point { int x; int y; } int arr[10]={1,2,3,4,5,6,7,8,9,10} Point* p = (Point*)arr; for(int i = 0;i < 5;i++,p++) { printf("%d %d\n",p->x,p->y); }……

Continue reading

C语言19 指针取值的两种方式

一级指针和多级指针 int i =100; int* p1 = &i; int** p2 = &p1; int*** p3 = &p2; int**** p4 = &p3; int***** p5 = &p4 int****** p6 = &p5; int******* p7 = &p6; int****** px1 = *(p7); int***** px2 = *(px1); int**** px3 = *(px2); int*** px4 = *(px3); int** px5 = *(px4); int* px6 = *(px5); int px7 = *(px6); int px7 = *(*(*(*(*(*(*(p7))))))); *()与[]的互换表示 int* p = (int*)1; printf("%d %d \n",p[0],*p); //p[0] = *(p+0) = *p int** p = (int**)1; printf("%d %d \n",p[0][0],**p); printf("%d %d \n",p[1][2],*(*(p+1)+2)); int*** p = (int***)1; printf("%d %d \n",p[1][2][3],*(*(*(p+1)+2)+3)); 同理: *(*(*(*(*(*(*(p7)))))))) = *(*(*(*(*(*(p7+0)+0)+0)+0)+0)+0) = p7[0][0][0][0][0][0][0] 总结 *(p+i) = p[i] *(*(p+i)+k) = p[i][k] *(*(*(p+i)+k)+m) = p[i][k][m] *(*(*(*(*(p+i)+k)+m)+w)+t) = p[i][k][m][w][t] *() 与 []可以……

Continue reading

C语言18 指针与字符串

字符串的几种表示方式有什么区别? 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" 弊端:字符串中英文混合的话。返……

Continue reading

C语言17 数组参数传递

基本类型参数传递 int x =1; void plus(int p) { p = p+1; } printf("%d \n",x); //x的值是多少? 数组作为参数 编写一个函数,能够打印任意整形数组的值 void PrintArray(int arr[],int nLength) {……

Continue reading

C语言16 取值运算符

“*”的几种用途 乘法运算符 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*……

Continue reading

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……

Continue reading

结构体 字节对齐的练习

分析结构体大小 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; }; 分析结构体大小 #pragma pack(1) struct S1 { char c1; double d; char c2; char c3; }; #pragma pack() struct S3 { char c1; S1 s; char c2; char c3; }; 分析结构体大小 #pragma pack(4) struct S1 { char c1; double d; char c2; char c3; }; #pragma pack() struct S3 { char c1; S1 s; char c2; char c3; }; 分析结构体大小 struct S1 { char c1; double d; char c2; char c3; }; #pragma pack(1) struct S3 { char c1; S1……

Continue reading

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; 结构体成员的使用 格式 : 结构体数组名[下标].成员名 arr[0].Age = 10; 字符串成员的处理 struct stStudent{ int Age; char Name[0x20]; } struct stStudent……

Continue reading