把握命运,追逐梦想

对自己所做的事要有兴趣,同时还要能够坚持不懈

统计

留言簿(1)

阅读排行榜

评论排行榜

数组 指针 const

#include<stdio.h>
#include
<string.h>

int main()
{
    
//下面的写法是可以的
    char a[5= "abcd";    
    
const char b[10= "safajshjf";
    
const char *= "asdfdsgd";
    
char *const d = "safdsfgsdg";
    
const char* const e = "adsgfsdg";


    
//下面的c和上面的d,e不同,c不是const的,而是c指向的内存区是const的,所以下面的写法可以
    c = "fasdffds";
    
//下面的三行都不行,原因是数组名除了初始化时,再也不能作为左值了。而const类型的d和e也不能再作为左值。
    /*a="afds";
    b = "asfdsfdgg";
    d = "fasdgsdg";
    e = "fasdfgg";
*/



    

    
//下面的可以,因为第一参数要求是非const的,下面的第一参数都满足条件
    strcpy(a,"sdfs");
    strcpy(d,
"sfsdgd");
    
//下面的不通过,因为第一参数要求是非const的,因为const常量不能修改
    /*strcpy(b,"sfsdgf");
    strcpy(c,"sfsgddg");
    strcpy(e,"safsgdg");
*/


    

    
//下面的写法是可以的,因为上面的a数组并不是常量,而是把“abcd”赋值给了a所指向的内存区,所以a的地址可以赋值给别的指针
    char *f=a;
    f 
= d;
    
//下面的是不行的,因为b的数组内存是常量的,不可以进行修改,所以不能把b的地址赋值给非const指针
    /*f = b;
    f = c;
    f =e;
*/



    
//下面的五个都是可以的,因为const和非const的变量都可以赋值给const类型的变量
    const char *= a;
    g  
=b;
    g  
= c;
    g 
= d;
    g 
= e;

    
//下面尝试修改上面的五块内存区


    
return 0;
}


//总结:
//const指针的用法如上例所示,分别是限制指针和指针内存区域的,但是虽然有这些限制,也仅是针对当前变量的限制,如果原本的内存地址已知,后来赋值给了const*类型的
//指针,那么利用原来的内存地址依然是可以修改该内存区域的。
//
//数组名相当于*const类型的,因为数组名和*const都在以后都不能再给数组名或指针赋值,而只能修改数组的内存区或指针指向的内存区。
//const* typename const类型的是指针和内存区都不可以修改的。
//
//无论是整形数组还是字符数组,初始化的时候都是赋值初始化的,不要把字符数组的初始化理解成把一个常量字符串的指针赋值给了字符数组名。
    //下面的写法是可以的
    char a[5= "abcd";    
00401740  mov         eax,dword ptr [___xi_z+2Ch (4020E4h)] 
00401745  mov         dword ptr [ebp-0Ch],eax 
00401748  mov         cl,byte ptr [___xi_z+30h (4020E8h)] 
0040174E  mov         
byte ptr [ebp-8],cl 
    
const char b[8= "safader";
00401751  mov         edx,dword ptr [___xi_z+34h (4020ECh)] 
00401757  mov         dword ptr [ebp-1Ch],edx 
0040175A  mov         eax,dword ptr [___xi_z
+38h (4020F0h)] 
0040175F  mov         dword ptr [ebp
-18h],eax 
    
const char *= "asdfdsgd";
00401762  mov         dword ptr [ebp-24h],offset ___xi_z+3Ch (4020F4h) 
    
char *const d = "safdsfgsdg";
00401769  mov         dword ptr [ebp-20h],offset ___xi_z+48h (402100h) 
    
const char* const e = "adsgfsdg";
00401770  mov         dword ptr [ebp-28h],offset ___xi_z+54h (40210Ch) 
//可以看出来,这是上面的程序的前五行的代码的反汇编,前两行的是赋值,汇编代码可以看出来,先把静态区中的常量字符串赋值给了eax,然后后eax转给字符数组的内存区,但是后面的三个则是直接把静态区的常量字符串的地址赋值给了指针,如果只赋值给const*指针还好,但是连*const指针也是直接赋值,结果导致了后面的strcpy(d,"sfd")的静态区内存访问错误

posted on 2009-07-29 10:19 把握命运 阅读(1223) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理