指针数组和结构体指针



指针数组
int*** arr[5] ={0};


char* keyword[] =             
{            
    "if",        
    "for",        
    "while",        
    ”switch",        
    "NULL"        
};            


结构体指针

    struct Arg    
    {    
        int a;
        int b;    
        int c;    
    };    
    
    
    ++运算
    

    Arg* pArg;

    pArg = (Arg*)100;
    //function1s(1);
    pArg++;  //因为struct数组宽度为12  100+12 运算时候需要砍*  
    printf("%d\n",pArg);  // 112
    
    
    
    Arg*** pArg;

    pArg = (Arg***)100;
    //function1s(1);
    pArg++;  //100 运算时候需要砍* Arg* 为4个字节 所以为104   
    printf("%d\n",pArg);  // 112
    
    
    加一个整数
    Arg* pArg;

    pArg = pArg+5;
    pArg++;  //因为struct数组宽度为5*12  100+60 运算时候需要砍*  
    printf("%d\n",pArg);  // 112
    
    
        加一个整数
    Arg*** pArg;

    pArg = pArg+5;
    pArg++;  //因为struct数组宽度为5*4  100+20 运算时候需要砍*  
    printf("%d\n",pArg);  // 112
    
    
    减法
    
    
    Arg* pArg;

    pArg = (Arg*)100;
    //function1s(1);
    pArg = pArg-5; //100-60 =40  砍去一个* pArg宽度为12
    printf("%d\n",pArg);

    return 0;
    
    
    Arg** pArg;
    pArg = (Arg**)100;
    //function1s(1);
    pArg = pArg-5; //100-20 =80 砍去一个* pArg宽度为4
    printf("%d\n",pArg);

    return 0;
    
    
    减法:
    
    Arg* pArg;

    pArg = (Arg*)100;
    pArg2 = (Arg*)20;
    int x = pArg - pArg2; // 100-20  在除以 Arg* 砍一个* 12  = 80/12 =6
    printf("%d\n",x);
    
    Arg** pArg2;
    Arg** pArg;

    pArg = (Arg**)100;
    pArg2 = (Arg**)20;
    int x = pArg - pArg2; // 100-20  在除以 Arg** 砍一个* 4  = 80/4 =20
    printf("%d\n",x);
    
    通过结构体指针读取、修改:
    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);

    结构体指针指向的内存可以是一个非结构体,例如;
    
            
    Struct Arg    
    {    
       int a;    
       int b;    
       int c;    
    }    
    
    指向int:
    int x=10;
    Arg* ps = (Arg*)&x;
    
    printf("%d\n",ps->a); //10
    printf("%d\n",ps->b); //未知,也可能可以访问
    
    假设指向一个int类型的数组
    
    int data[] = {10,30,40}
    Arg* ps = (Arg*)&data[0];
    
    printf("a->%d\n,b->%d\n,c->%d\n",ps->a,ps->b,ps->c);

    
    
    
    


    练习题:
    
    01 创建一个int* arr[5] 数组,并为数组赋值(使用&).        

        
        int a1 = 100;            
        int a2 = 200;            
        int a3 = 300;            
        int a4 = 400;            
        int a5 = 500;            

        int* p1 = &a1;            
        int* p2 = &a2;            
        int* p3 = &a3;            
        int* p4 = &a4;            
        int* p5 = &a5;            

        int* arr[5] = {p1,p2,p3,p4,p5};


        int main(int argc, char* argv[])
        {
            
            int** x = arr;  //指针&arr 的返回类型为本身加*  int*加*=int**
            
            printf("%d\n",*(*x));   //*x 为p1的指针的值 *x=p1 **x = *(p1) = 100

            return 0;
        }
        
        循环获取指针数组:
            int a1 = 100;            
    int a2 = 200;            
    int a3 = 300;            
    int a4 = 400;            
    int a5 = 500;            
    
    int* p1 = &a1;            
    int* p2 = &a2;            
    int* p3 = &a3;            
    int* p4 = &a4;            
    int* p5 = &a5;            
    
    int* arr[5] = {p1,p2,p3,p4,p5};

    int** x = arr;


    for (int i=0;i<5;i++)
    {
    
        printf("%d\n",**x);
        **x++;
        
    }

        
        
        
    2、创建一个字符指针数组,存储所有的C的关键词(查资料找),并全部打印出来.                            
            
    
            char* p1 = "if";                
            char* p2 = "for";                
            char* p3 = "while";                
            char* p4 = "switch";
                
            char* keyword[] = {p1,p2,p3,p4};                
            
            char**  px = keyword;
            
            printf("%x\n",px); //0012FF60
            printf("%x\n",*px); //*0012FF60 = 0042213c

            for(int i=0;i<4;i++){
            
                printf("%s\n",*px);
                px++;
    }

        
        反汇编代码:
        
        
        468:      char* p1 = "if";
        0040DB98   mov         dword ptr [ebp-4],offset string "if" (0042213c) //将常量 if存储到0042213c中
        469:      char* p2 = "for";
        0040DB9F   mov         dword ptr [ebp-8],offset string "for" (0042202c)  //将常量 for存储到0042213c中
        470:      char* p3 = "while";
        0040DBA6   mov         dword ptr [ebp-0Ch],offset string "while" (00422fc4)//将常量 while存储到00422fc4中
        471:      char* p4 = "switch";
        0040DBAD   mov         dword ptr [ebp-10h],offset string "switch" (00422fbc) //将常量 switch存储到00422fbc中
        472:
        473:      /*
        474:      char** px1 = &p1;
        475:      printf("%x\n",px1); px1
        476:      printf("%x\n",*px1);
        477:      */
        478:
        479:      char* keyword[] = {p1,p2,p3,p4};
        0040DBB4   mov         eax,dword ptr [ebp-4]   //将 0042213c放到eax
        0040DBB7   mov         dword ptr [ebp-20h],eax //将 0042213c放到地址ebp-20h(0012FF60)中
        0040DBBA   mov         ecx,dword ptr [ebp-8]   //以此类推
        0040DBBD   mov         dword ptr [ebp-1Ch],ecx
        0040DBC0   mov         edx,dword ptr [ebp-0Ch]
        0040DBC3   mov         dword ptr [ebp-18h],edx
        0040DBC6   mov         eax,dword ptr [ebp-10h]
        0040DBC9   mov         dword ptr [ebp-14h],eax
        480:
        481:      char**  px = keyword;        
        0040DBCC   lea         ecx,[ebp-20h] //取0012FF60 ecx=0012FF60             
        0040DBCF   mov         dword ptr [ebp-24h],ecx 将ecx放到px=0012FF60
        482:
        483:      printf("%x\n",px); //输出0012FF60
        0040DBD2   mov         edx,dword ptr [ebp-24h]   // ebp-24h=0012FF60 放到edx
        0040DBD5   push        edx                     //0012FF60的值
        0040DBD6   push        offset string "%x\n" (00422fb4)   // %x为print的第二个参数
        0040DBDB   call        printf (004014f0)    //调用print函数地址
        0040DBE0   add         esp,8  //堆栈平衡
        484:      printf("%x\n",*px);
        0040DBE3   mov         eax,dword ptr [ebp-24h]  // ebp-24h=0012FF60 放到eax   
        0040DBE6   mov         ecx,dword ptr [eax]     //将0012FF60的值放到ecx
        0040DBE8   push        ecx                        
        0040DBE9   push        offset string "%x\n" (00422fb4)
        0040DBEE   call        printf (004014f0)
        0040DBF3   add         esp,8
        485:
        486:      for(int i=0;i<4;i++){
        0040DBF6   mov         dword ptr [ebp-28h],0
        0040DBFD   jmp         main+88h (0040dc08)
        0040DBFF   mov         edx,dword ptr [ebp-28h]
        0040DC02   add         edx,1
        0040DC05   mov         dword ptr [ebp-28h],edx
        0040DC08   cmp         dword ptr [ebp-28h],4
        0040DC0C   jge         main+0ACh (0040dc2c)
        487:
        488:          printf("%s\n",*px);
        0040DC0E   mov         eax,dword ptr [ebp-24h]
        0040DC11   mov         ecx,dword ptr [eax]
        0040DC13   push        ecx
        0040DC14   push        offset string "%c" (00422028)
        0040DC19   call        printf (004014f0)
        0040DC1E   add         esp,8
        489:          px++;
        0040DC21   mov         edx,dword ptr [ebp-24h]
        0040DC24   add         edx,4
        0040DC27   mov         dword ptr [ebp-24h],edx


    
        作业3:
        3、查找这些数据中,有几个id=1 level=8的结构体信息。                    

        0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,                    
        0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0x00,                    
        0x00,0x33,0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x00,                    
        0x00,0x00,0x00,0x02,0x64,0x00,0x00,0x00,0xAA,0x00,                    
        0x00,0x00,0x64,0x01,0x00,0x00,0x00,0x08,0x00,0x00,                    
        0x00,0x00,0x02,0x00,0x74,0x0F,0x41,0x00,0x00,0x00,                    
        0x01,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x0A,0x00,                    
        0x00,0x02,0x57,0x4F,0x57,0x00,0x06,0x08,0x00,0x00,                    
        0x00,0x00,0x00,0x64,0x00,0x0F,0x00,0x00,0x0D,0x00,                    
        0x00,0x00,0x23,0x00,0x00,0x64,0x00,0x00,0x64,0x00                    

        
        typedef struct TagPlayer        
        {        
            int id;    
            int level;    
        }Player;        
        
        
        
    
        void function1()
        {
            char* p=data;
            int nsum=0;
            Player* splayer; // 实例化一个结构体指针

            for(int i=0;i<96;i++){
                splayer = (Player*)(int*)(p+i);
                if(splayer->id==1 && splayer->level==8)
                {
                    nsum++;
                }
            }

            printf("%d\n",nsum);

        }
                


   
发表评论 / Comment

用心评论~