首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于指向恒量的指针

2013-11-03 
关于指向常量的指针已经知道char *sabcd;是正确的,s是指向字符串常量abcd的指针。但是int *p&2为什么

关于指向常量的指针
已经知道char *s="abcd";是正确的,s是指向字符串常量"abcd的指针。但是int *p=&2为什么不对呢,p为什么不能指向int型常量2呢关于指向恒量的指针" 指针
[解决办法]
这个问题问得好,我以前也想过
因为2可以直接写在汇编指令里,也就是放在机器指令里了.既然放在机器指令里,也就没有什么地址而言了.但是字符串就不同了,整个字符串无法放在存放在机器指令里,只能放在内存空间里,存取访问.
比如
int a=2;
编译成汇编指令就是
mov         dword ptr [a],2  

[解决办法]
一元 & 运算符要求操作数是左值 
2不用是左值 然后就死了

[解决办法]

1:    #include <stdio.h>
2:    int *p;
3:    void p2() {
00401000 55                   push        ebp
00401001 8B EC                mov         ebp,esp
00401003 83 EC 44             sub         esp,44h
00401006 53                   push        ebx
00401007 56                   push        esi
00401008 57                   push        edi
4:        int a;
5:
6:        a=2;
00401009 C7 45 FC 02 00 00 00 mov         dword ptr [ebp-4],2
7:    }
00401010 5F                   pop         edi
00401011 5E                   pop         esi
00401012 5B                   pop         ebx
00401013 8B E5                mov         esp,ebp
00401015 5D                   pop         ebp
00401016 C3                   ret
--- No source file  ---------------------------------------------------------------------------
00401017 CC                   int         3
00401018 CC                   int         3
00401019 CC                   int         3
0040101A CC                   int         3
0040101B CC                   int         3
0040101C CC                   int         3
0040101D CC                   int         3
0040101E CC                   int         3
0040101F CC                   int         3
8:    int main() {
00401020 55                   push        ebp
00401021 8B EC                mov         ebp,esp


00401023 83 EC 40             sub         esp,40h
00401026 53                   push        ebx
00401027 56                   push        esi
00401028 57                   push        edi
9:        p=(int *)((char *)p2+0x0C);
00401029 B8 00 10 40 00       mov         eax,offset p2 (00401000)
0040102E 83 C0 0C             add         eax,0Ch
00401031 A3 20 30 40 00       mov         [p (00403020)],eax
10:       printf("p2==0x%08x,p==0x%08x,*p==%d\n",(char *)p2,p,*p);
00401036 8B 0D 20 30 40 00    mov         ecx,dword ptr [p (00403020)]
0040103C 8B 11                mov         edx,dword ptr [ecx]
0040103E 52                   push        edx
0040103F A1 20 30 40 00       mov         eax,[p (00403020)]
00401044 50                   push        eax
00401045 68 00 10 40 00       push        offset p2 (00401000)
0040104A 68 A4 20 40 00       push        offset string "p2==0x%08x,p==0x%08x,*p==%d\n" (004020a4)
0040104F FF 15 00 20 40 00    call        dword ptr [__imp__printf (00402000)]
00401055 83 C4 10             add         esp,10h
11:       return 0;
00401058 33 C0                xor         eax,eax
12:   }
0040105A 5F                   pop         edi
0040105B 5E                   pop         esi
0040105C 5B                   pop         ebx
0040105D 8B E5                mov         esp,ebp
0040105F 5D                   pop         ebp
00401060 C3                   ret
//p2==0x00401000,p==0x0040100c,*p==2
//


1:    #include <stdio.h>
2:    int *p;
3:    void p2() {
00401000 55                   push        ebp
00401001 8B EC                mov         ebp,esp
00401003 83 EC 44             sub         esp,44h
00401006 53                   push        ebx
00401007 56                   push        esi
00401008 57                   push        edi
4:        int a;
5:
6:        a=2;


00401009 C7 45 FC 02 00 00 00 mov         dword ptr [ebp-4],2
7:    }
00401010 5F                   pop         edi
00401011 5E                   pop         esi
00401012 5B                   pop         ebx
00401013 8B E5                mov         esp,ebp
00401015 5D                   pop         ebp
00401016 C3                   ret
--- No source file  ---------------------------------------------------------------------------
00401017 CC                   int         3
00401018 CC                   int         3
00401019 CC                   int         3
0040101A CC                   int         3
0040101B CC                   int         3
0040101C CC                   int         3
0040101D CC                   int         3
0040101E CC                   int         3
0040101F CC                   int         3
8:    int main() {
00401020 55                   push        ebp
00401021 8B EC                mov         ebp,esp
00401023 83 EC 40             sub         esp,40h
00401026 53                   push        ebx
00401027 56                   push        esi
00401028 57                   push        edi
9:        p=(int *)((char *)p2+0x0C);
00401029 B8 00 10 40 00       mov         eax,offset p2 (00401000)
0040102E 83 C0 0C             add         eax,0Ch
00401031 A3 20 30 40 00       mov         [p (00403020)],eax
10:       printf("p2==0x%08x,p==0x%08x,*p==%d\n",(char *)p2,p,*p);
00401036 8B 0D 20 30 40 00    mov         ecx,dword ptr [p (00403020)]
0040103C 8B 11                mov         edx,dword ptr [ecx]
0040103E 52                   push        edx
0040103F A1 20 30 40 00       mov         eax,[p (00403020)]
00401044 50                   push        eax
00401045 68 00 10 40 00       push        offset p2 (00401000)


0040104A 68 A4 20 40 00       push        offset string "p2==0x%08x,p==0x%08x,*p==%d\n" (004020a4)
0040104F FF 15 00 20 40 00    call        dword ptr [__imp__printf (00402000)]
00401055 83 C4 10             add         esp,10h
11:       return 0;
00401058 33 C0                xor         eax,eax
12:   }
0040105A 5F                   pop         edi
0040105B 5E                   pop         esi
0040105C 5B                   pop         ebx
0040105D 8B E5                mov         esp,ebp
0040105F 5D                   pop         ebp
00401060 C3                   ret
//p2==0x00401000,p==0x0040100c,*p==2
//


[解决办法]
#pragma comment(linker,"/SECTION:.text,RW")
//上面这句让代码段可写
#include <stdio.h>
int *p;
int p2() {
    int a;

    a=2;
    return a;
}
int main() {
    p=(int *)((char *)p2+0x0C);
    printf("p2==0x%08x,p==0x%08x,*p==%d\n",(char *)p2,p,*p);
    *p=3;
    printf("p2()==%d\n",p2());
    return 0;
}
//p2==0x00401000,p==0x0040100c,*p==2
//p2()==3
//

热点排行