P35-P37指针6,7,8

复制代码
步骤一:                    
                    
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;    
    }        
复制代码

 

posted @   摸鱼小曹  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示