第二天的学习
- 一个人站在岔道口,分别通向A国和B国,这两个国家的人非常奇怪,
A国的人总是说实话,B国的人总是说谎话。路口站着一个A国人和一个B国人:甲和乙,
但是不知道他们真正的身份,现在那个人要去B国,但不知道应该走哪条路,需要问这两个人。
只许问一句。他是怎么判断该走那条路的?
如果甲是A国人,说的是真话,问甲:“如果我问乙哪条路是B之路,他会指哪条路?”他指出的乙说的路就是错误的,另一条路就是正确的。
如果甲是B国人,说的是假话同样的问题问甲,因为乙说真话,甲会和乙的答案相反,那么另一条路就是正确的。
甲 A真,乙 B假 1A,2B 乙 1A, 1A 另外一条是正确
甲 B假,乙 A真 1A,2B 乙 2B, 1a, 2b是正确
攻击百度某广告:
1 //攻击百度xianhua的广告 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<windows.h> 5 void openbaidu() 6 { 7 ShellExecuteA(0, "open", "http://www.baidu.com", 0, 0, 3); 8 } 9 10 void closebaidu() 11 { 12 system("taskkill /f /im iexplore.exe");//如果你默认浏览器是360就要 用360se.exe替换 13 } 14 15 16 void search() 17 { 18 keybd_event('X', 0, 0, 0);//按下X 19 keybd_event('X', 0, 2, 0);//松开X 20 keybd_event('I', 0, 0, 0); 21 keybd_event('I', 0, 2, 0); 22 keybd_event('A', 0, 0, 0); 23 keybd_event('A', 0, 2, 0); 24 keybd_event('N', 0, 0, 0); 25 keybd_event('N', 0, 2, 0); 26 keybd_event('H', 0, 0, 0); 27 keybd_event('H', 0, 2, 0); 28 keybd_event('U', 0, 0, 0); 29 keybd_event('U', 0, 2, 0); 30 keybd_event('A', 0, 0, 0); 31 keybd_event('A', 0, 2, 0); 32 Sleep(200); 33 keybd_event(0x0d, 0, 0, 0);//按下回车 34 keybd_event(0x0d, 0, 2, 0);//松开回车 35 36 } 37 38 void clickbaidu() 39 { 40 SetCursorPos(200, 300);//把光标移到屏幕的指定位置 41 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//按下鼠标左键 42 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//松开鼠标左键 43 44 } 45 46 47 void main() 48 { 49 for (;;) 50 { 51 openbaidu(); 52 Sleep(1000); 53 search(); 54 Sleep(1000); 55 clickbaidu(); 56 Sleep(3000); 57 closebaidu(); 58 } 59 }
- N维数组有大括号初始化,只有第一个中括号省略
列如:a[][4] = {}; a[][][5] = {};
1 //二维数组一维初始化的方法 2 #include<stdio.h> 3 #include<stdlib.h> 4 5 void main() 6 { 7 int a[3][4]; 8 for (int i = 0; i < 3 * 4; i++) 9 { 10 a[i / 4][i % 4] = i;//a[i][j] = i*n +j+1; 11 printf("%-5d", a[i / 4][i % 4]); 12 if ((i + 1) % 4 == 0) 13 printf("\n"); 14 } 15 getchar(); 16 }
1 //三维数组一维初始化方法 2 #include<stdio.h> 3 #include<stdlib.h> 4 5 void main() 6 { 7 int a[3][4][5]; 8 for (int i = 0; i < 3 * 4 * 5; i++) 9 { 10 a[i / 20][(i / 5) % 4][i % 5] = i; 11 printf("%-5d", a[i / 20][(i / 5) % 4][i % 5]); 12 if ((i + 1) % 5 == 0) 13 printf("\n"); 14 } 15 getchar(); 16 }
- 多维数组a[i]代表某行的输地址。所以a[i] + j等价于&a[i][j]。而*(&a[i][j]) 等价于a[i][j]
1 //二级指针 2 #include<stdio.h> 3 #include<stdlib.h> 4 5 void main() 6 { 7 8 int a = 32138; 9 int *p = &a; 10 int **pp = &p; //指向指针的指针,即指向一级指针指向的变量 11 printf("%d,%d,%d\n", a, *p, **pp); 12 char *p1 = p;//如果是cpp类型就不行 13 double *p2 = p; 14 printf("%d\n", *p); 15 printf("%d\n", *p1); 16 printf("%f\n", *p2); 17 printf("%d,%d,%d\n", sizeof(p), sizeof(p1), sizeof(p2));//4,4,4地址都是四个字节 18 printf("%d,%d,%d\n", sizeof(*p), sizeof(*p1), sizeof(*p2));//4,1,8类型结果 19 getchar(); 20 21 }
- 对一个数排序,如果不想调动它们的大小,可以对这个数的地址进行排序(如:银行账户的储金排序)
- 二级指针
1 #include<stdio.h> 2 #include<stdlib.h> 3 int a = 7; 4 int b = 8; 5 int *pA = &a; 6 int *pB = &b; 7 8 void changeA(int **pp); 9 void changeB(int ***ppp); 10 11 void main() 12 { 13 14 int **pp = &pA; 15 printf("%d\n", **pp); 16 printf("%x,%x\n", pp, &pA); 17 changeA(pp);//新建一个二级指针指向p2,不会改变原来的值 18 printf("%d\n", **pp); 19 printf("%x,%x\n", pp, &pA); 20 changeB(&pp);//ppp=&pp//ppp三级指针代表拥有三个地址并且管理第三个地址,&pp代表第三个地址&+p+p。*ppp代表第二个地址ppp-*。 21 printf("%d\n", **pp); 22 printf("%x,%x\n", pp, &pA); 23 24 getchar(); 25 } 26 27 28 void changeA(int **pp)//新建一个二级指针指向p2,不会改变原来的值 29 { 30 pp = &pB; 31 } 32 33 void changeB(int ***ppp)// 34 { 35 *ppp = &pB;//*ppp代表 二级指针的地址 36 }
- malloc
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void main() 5 { 6 int *p = (int *)malloc(20*4);//分配80个字节内存 1k=1024字节(bytes),1字节=8位(bits) 7 8 //给内存赋值 9 for (int i = 0; i < 20; i++) 10 { 11 p[i] = i;//[]的作用☆ int a[]={1,2,3}; int *p=a; p[i]等价于a[i] 但是 p++ √ 而 a++ × 12 printf("%d,%x\n", p[i], &p[i]); 13 printf("%d,%x\n", *(p + i), p + i); 14 } 15 free(p); 16 //free(p);//如果没有赋空值就会报错 17 p =NULL; 18 free(p);//赋空值后可以联系free 19 free(p); 20 free(p); 21 22 getchar(); 23 }
- 指针指引多维数组

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void main() 5 { 6 int a[4][5]; 7 for (int i = 0; i < 4 * 5; i++) 8 { 9 a[i / 5][i % 5] = i; 10 printf("%-5d", a[i / 5][i % 5]); 11 if ((i + 1) % 5 == 0) 12 printf("\n"); 13 } 14 15 //三个类型相同步长不同的输地址 16 printf("%x\n", a);//数组第一行的行地址 17 printf("%x\n", *a);//数组第一个元素地址 18 printf("%x\n", &a);//数组的首地址 19 printf("%d,%d,%d\n", sizeof(*a), sizeof(**a), sizeof(*&a));//20,4,80; 20 21 int (*p)[5] = a;//等价于int (*p)[5] = &a; 22 //a++; //错,a是个常量指针 23 24 printf("%-5d,%-5d,%-5d,%-5d,%-5d,%-5d\n", *a, *(a + 1), *(a + 2), *a[0], *(a[0] + 1), *(a[2])); 25 //a,a+1,a+2 是行地址,a[0],a[0]+1,a[2]是列地址 26 27 printf("%-5d,%-5d,%-5d,%-5d,%-5d,%-5d\n", *p, *(p + 1), *(p + 2), *p[0], *(p[0] + 1), *(p[2])); 28 29 system("pause"); 30 }
- 字符常量
1 //字符常量 2 #include<stdio.h> 3 #include<stdlib.h> 4 5 void main() 6 { 7 char *ps = "ipcolfig";//字符串常量,不可以单个输出 8 char *pr = ps; 9 pr += 4; 10 //*pr = 'n';//ps是个地址常量,常量不可以更改 11 printf("%c\n", *pr); 12 system(ps); 13 14 char str[20] = "taskoist";//可以单个输出 15 char *p = str; 16 p += 4; 17 *p = 'l'; 18 printf("%x\n", str); 19 20 system(str); 21 22 system("pause"); 23 24 }

浙公网安备 33010602011771号