步骤一: char* p1 = "if"; char* p2 = "for"; char* p3 = "while"; char* p4 = "switch"; char* keyword[] = {p1,p2,p3,p4}; 步骤二: char* keyword[] = { if, for, while, switch }; 步骤三: char* keyword[] = { if, for, while, switch, NULL };
最常用的指针数组:
!!!!!!!!!!!!!!!!!!!!!!!!!
结构体指针:
Struct Arg
结构体指针: Struct Arg { int a; int b; int c; };
1、探测结构体指针的特性
(1)++ -- 减去一个*判断 下同理
(2)+整数 -整数
2、通过结构体指针读取、修改:
//创建结构体 Student s; s.a = 10; s.b = 20; s.c = 30; //声明结构体指针 Student* ps; //为结构体指针赋值 ps = &s; //通过指针读取数据 printf("%d\n",ps->a); //通过指针修改数据 ps->a = 100; printf("%d\n",ps->a);
!!!!!!!!!!
多级指针:
0xC00000005地址访问错误
*p ==*(p+0)==p[0] *(p+i) = p[i]
只有*类型可以直接在前面加* char short int等类型不行
**p2 *(*(p2+0)+0)==p2[0][0]
*(*(p2+2)+3) p2:char** p2+2 char** 8 /char* 3
***p3 p3:char*** *p3:char** **p3:char*
!!!!!!!!!!!!!!
数组指针:
int (*px)[5];
宽度:4
赋值:px = (int(*)[5])10;
++:+5*4 即20
px 与 *px存储的值一样 为但不同类型的+-对应,宽度不一致
int *p[5] 与 int (*p)[5] 有什么区别?
原因:
[] 的优先级高于* 所以先组合成p[5]数组 再由int *说明 数组存储的类型 == int* p[5];
() 的优先级高于[] 所以*先p先组合成指针 再由int[5]说明数组的宽度
!!!!!!!!!
函数指针:
1、函数指针的声明:
返回类型(*函数名)(参数表)
如:int (*pFun)(int,int);
2、探测:
宽度:4 不能进行++ -- 加减运算
3、函数指针的赋值:
pFun = (int (*)(int,int))10;
或者 pFun = 函数名.
4、函数指针的使用:
与函数使用方式相同
5、另一种常见的表示:
typedef int (*Fun)(int,int);
这个不是变量的声明,而是为函数指针起个别名:Fun 相当于函数指针类型
Fun p;
这个才是变量的声明,p是变量,Fun是类型.
6、隐藏代码到数据区:
代码和数据有什么区别?
unsigned char code[] = { 0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x40, 0x53, 0x56, 0x57, 0x8D, 0x7D, 0xC0, 0xB9, 0x10, 0x00, 0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0xF3, 0xAB, 0x8B, 0x45, 0x08, 0x03, 0x45, 0x0C, 0x5F, 0x5E, 0x5B, 0x8B, 0xE5, 0x5D, 0xC3 }; int main(int argc, char* argv[]) { typedef int (*Fun)(int,int); Fun p = (int (*)(int,int))&code; int x = p(2,2); printf("%d\n",x); return 0; }
标签:p2,p3,int,char,函数指针,P35,P37,指针 From: https://www.cnblogs.com/cspecialr/p/17222656.html