[c/c++] programming之路(17)、高级指针

一、二级指针

二级指针的作用:
1.函数改变外部变量指针
2.外挂改变一个指针的值

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
 4 void main(){
 5     int a = 10;
 6     int b = 20;
 7     int *p1 = &a;
 8     int *p2 = &b;
 9     int **pp = &p1;
10     printf("%d,", **pp);
11     printf("\n%x,%x,%x", p1, *pp,&a);
12     pp = &p2;
13     printf("%d,", **pp);
14     printf("\n%x,%x,%x", p2, *pp, &b);
15     printf("\n%d,%d", *p2, b);
16
17     system("pause");
18 }

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
 4 void main(){
 5     int a[] = { 1, 2, 3, 4, 5, 6, 7 };
 6     printf("%d", sizeof(a));// 28.    C语言规定,数组地址整体大小
 7     printf("\n%d", sizeof(a)/sizeof(int));
 8
 9     int *p = a;
10     printf("\n%d", sizeof(p));
11     //a = p + 1;  =”: 左操作数必须为左值:a是一个常量,不能作为左值
12     printf("\n%x,%x", a,p);
13     //数组名就是一个常量指针,p是变量指针,
14     //中括号可以根据指针的地址往下找出内容
15     //数组的本质就是一片连续的内存,数组名就是地址
16     for (int i = 0; i < 7; i++)
17     {
18         printf("\n%d,%x", p[i], &p[i]);
19         printf("\n%d,%x", *(p+i),p+i);
20         //p+i  p往前移动i个元素的地址
21         // *(p+i)   p往前移动i个元素
22     }
23     printf("\n\n");
24     for (int *px = a; px < a + 7; px++)
25     {
26         printf("\npx=%x,*px=%d", px, *px);
27     }
28
29     system("pause");
30 }

二、三级指针

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
 4 //C程序分配给全局变量内存后,才启动main函数
 5 int a=10;
 6 int *p1=&a;
 7 int b=20;
 8 int *p2=&b;
 9
10 void change(int **pp){//新建一个二级指针,指向P2;不会改变原来指针指向的地址
11     pp=&p2;
12     printf("change pp=%x\n",pp);
13 }
14
15 void changeA(int ***ppp){
16     *ppp=&p2;
17 }
18
19 void main(){
20     int **pp=&p1;
21     printf("main pp=%x\n",pp);
22     change(pp);
23     printf("%d\n",**pp);
24     changeA(&pp);
25     printf("%d\n",**pp);
26     getchar();
27 }

三、外挂(指针应用)

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<Windows.h>
 4
 5 void msg(){
 6     MessageBoxA(0,"open","阿飞在泡妞",0);
 7 }
 8
 9 int add(int a,int b){
10     system("tasklist");
11     return a + b;
12 }
13
14 void main(){
15     int numA=100;
16     int numB=20000;
17     int *p1 = &numA;
18     int *p2 = &numB;
19     int **pp=&p1;
20     char str[5] = { ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘ };
21     char *pch=str;
22     //printf("%x,%x\n",msg,add);
23     printf("%x,%x\n",&numA,&numB);
24     printf("&p1=%x,&p2=%x,&pp=%x,&pch=%x,str=%x\n",&p1,&p2,&pp,&pch,str);
25     while (1)
26     {
27         printf("阿飞的目标是泡%d个妞\n",numA);
28         printf("阿飞的月薪是%d元\n",numB);
29         printf("阿飞已经泡了%d个妞\n",*p1);
30         printf("阿飞希望的RMB%d元\n", **pp);
31         printf("阿飞在泡妞届的级别%c\n",*pch);
32         Sleep(25000);
33         printf("\n");
34     }
35
36
37
38     system("pause");
39 }
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<Windows.h>
 4 _declspec(dllexport) void go(){
 5     while (1)
 6     {
 7         void(*p)()=(void(*)())0x11010f5;
 8         p();
 9         Sleep(5000);
10     }
11 }
12
13 _declspec(dllexport) void goA(){
14     int (*p)(int,int)=(int (*)(int,int))0x1191096;
15     printf("%d\n",p(10,30));
16     system("title 马化腾");
17     system("color 5E");
18 }
19
20 _declspec(dllexport) void goB(){
21     system("color 5E");
22     //改变两个变量:numA,numB
23     int *p1=(int *)0x43f860;
24     int *p2=(int *)0x43f854;
25     *p1=10000;
26     *p2=2147483647;
27
28     //改变指针p1,将p1指向numA改为numB
29     int **p3=(int **)0x43f848;
30     *p3=(int *)0x43f854;
31
32     //改变二级指针pp,将pp指向p1改为p2
33     int ***p4=(int ***)0x43f830;
34     *p4=(int **)0x43f83c;
35
36     //改变数组指向
37     char **pp=(char **)0x43f814;
38     *pp=(char *)(0x43f820+0x1);
39 }

时间: 08-22

[c/c++] programming之路(17)、高级指针的相关文章

[c/c++] programming之路(16)、指针

一.调戏百度云管家 1 #include<stdlib.h> 2 #include<windows.h> 3 4 _declspec(dllexport) void go(){ 5 while(1){ 6 ShellExecuteA(0,"open","http://www.baidu.com",0,0,1); 7 MessageBoxA(0,"因为你的百度网盘存放了大量岛国大片","来自百度的邀请",

【学习ios之路:C语言】②高级指针应用

1.指针与字符数组 <span style="font-size:14px;"> /** 定义字符串的2种方式 * 1.利用数组 * char name[] = "itcast" * *特点:字符串里面的字符是可以修改的 * *使用场合:字符串的内容需要经常修改. * 2.利用指针 * char *name = "itcast"; * *特点:字符串其实是一个常量字符串,里面的字符是不能修改的; * *使用场合:字符串内容不需要修改,

[c/c++] programming之路(15)、多维数组和二分查找法,小外挂

一.多维数组 1 #include<stdio.h> 2 #include<stdlib.h> 3 4 void main(){ 5 int num[3][4]; 6 int i,j; 7 for (i = 0; i < 3; i++) 8 { 9 for (j = 0; j < 4; j++) 10 { 11 num[i][j]=4*i+j+1; 12 printf("%-3d",num[i][j]); 13 } 14 printf("\

C语言--- 高级指针2(结构体指针,数组作为函数参数)

一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针     结构体:     typedef  struct stu{                          char name[20];                          char sex;                          int age;                    }Student;     Student stu1 = {"zhangsan",'m',23};  

C++学习之路: 智能指针入门

引言: 编写智能指针的要点:a) 构造函数接收堆内存b) 析构函数释放内存c) 必要时要禁止值语义.d) 重载*与->两个操作符 1 #ifndef START_PTR_H 2 #define START_PTR_H 3 4 #include <iostream> 5 using namespace std; 6 7 class Animal 8 { 9 public: 10 Animal() { cout << "Animal" << end

[c/c++] programming之路(21)、字符串(二)

一.for /l %i in (1,1,5) do calc 等命令行参数 1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 5 void main() { 6 /*char str[] ="for /l %i in (1,1,5) do calc"; 7 char *p = "for /l %i in (1,1,5) do calc";*

C和指针 第十三章 高级指针话题

高级声明: int (*f)(); 这里声明有两个括号,第二个括号是函数调用,第一个括号是聚组作用.(*f)是一个函数,所以f是指向返回整型的函数的指针.程序中的每个函数都位于,内存中某个位置,所以存在指向那个位置的指针. int *f[]; 下标的优先级高,所以f是个数组,数组中元素为指向int的指针. int (*f[])() 首先按照优先级进行分析,括号内(*f[])先求值,所以*f[], f是数组,数组元素是指向某种类型的指针,结合外面的看,f是一个数组,数组元素是指向返回int类型的函

C的指针疑惑:C和指针13(高级指针话题)

传递命令行参数 C程序的main函数具有两个形参.第一个通常称为argc,代表命令行参数的数目. 第二个通常称为argv,它指向一组参数值.由于参数的数目并没有内在的限制,所以argv指向这组参数值(从本质上说是一个数组)的第一个元素. int main(int argc,char **argv) 字符串常量:当一个字符串常量出现于表达式中时,它的值是个指针常量. 编译器把这些指定字符的一份拷贝存储在内存的某个位置,并存储一个指向第一个字符的指针. "XYZ"+1 这个表达式的结果是个

C语言 --- 高级指针

1. 指针赋值: C语言允许使用赋值运算进行指针的赋值,前提是两个指针具有相同的类型.                 int i,*p,*q;                 p = &i;                 q = p; 此时p和q存储的都是i的地址.                  *p = 1; 此时改变i的值为1;                  *q = 2; 此时改变i的值为2; 2. 指针作为函数的参数,可以实现在函数内部改变函数外部变量的值