Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2707659
  • 博文数量: 416
  • 博客积分: 10220
  • 博客等级: 上将
  • 技术积分: 4193
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-15 09:47
文章分类

全部博文(416)

文章存档

2022年(1)

2021年(1)

2020年(1)

2019年(5)

2018年(7)

2017年(6)

2016年(7)

2015年(11)

2014年(1)

2012年(5)

2011年(7)

2010年(35)

2009年(64)

2008年(48)

2007年(177)

2006年(40)

我的朋友

分类: C/C++

2007-11-11 19:04:14

1、const修饰一个非指针变量时必须被初始化,(如果为指针变量则 const * 可以不被初始化,但是有warning;如果为 * const 则必须被初始化)
const int a =100 ;
    结果:
    1 变量a不能直接被修改。类似 a=101;这样的语句不能通过编译
    2 取地址操作也需要加const 修饰符,
           const int *b=&a ;
      否则编译失败.失败信息:'initializing' : cannot convert from 'const int *__w64 ' to 'int *'。
    3 引用操作符定义别名也需要加const修饰符,否则编译失败
           const int &c=a ;
      否则编译失败,失败信息: cannot convert from 'const int' to 'int &' d

2、首先是const配合指针的四个典型用法
int b = 500;
const int* a = &b;    [1]
int const *a = &b;   [2]
int* const a = &b;   [3]
const int* const a = &b; [4]

1和2 一样 都表示指针指向常量,3表示常指针,4表示指向常量的常指针。
虽然1和2都表示指向常量,但是b不一定要为const,因此b可以修改。但是 (*a)不能修改。

3、const 放置于函数声明最后,如 const int * getnum() const;
 说明该函数为函数为const成员函数,这个函数不能修改成员变量,也不能调用非const函数。

********************************************
 void main()
{
 int a[]={1,2,3,4,5,6},*p,k=3;

 p=&k;
 //在这之后我在书上看到过下面的表达式,不知道到底哪个对!
// p=a;
// p=&a; //error
// p=&a[0]; 
// *p=&a; //error
// *p=a; //error
// *p=&a[0]; //error
// **p=&a[0]; //error
 *p=a[0];  //改变的是P指针所指的值K,此时K=1
 int   b=11;  
 int  *c=&b;//
 c = a; //c指针指向a首地址
}


int   a[]={1,2,3,4,5,6},*p;  
  p=a;  
  p=&a[0];  
  //p=&a;//cannot   convert   from   'int   (*)[6]'   to   'int   *'        
  //*p=&a;//cannot   convert   from   'int   (*)[6]'   to   'int'  
  //*p=a;//cannot   convert   from   'int   [6]'   to   'int'  
  //*p=&a[0];//cannot   convert   from   'int   *'   to   'int'  
  纯C中每个都可以能过编译,因为它们按左操作数的类型作了隐式转换,  
  C++中不行,只有两个是合法的。

a其实就是a[6]这个数组的首地址,也是a[0]这个数组元素的地址.所以a等价于&a[0].第一个和第三个将a数组的首地址赋给指针p,所以是正确的.  

int   array[10];  
int   (*ptr)[10];  
ptr=&array;:
上例中ptr是一个指针,它的类型是int(*)[10],他指向的类型是int[10]   ,我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。
尽管array是直接声明的数组,array和&array是同一地址,但赋值时依然要给array的地址值&array。
int   (*ptr)[10]你理解的也很正确,它不是int数组,也不是int指针的数组,它就是个用来指向int[]的指针。

int   array[10];数组
int   (*ptr)[10];   指向10个元素的数组的指针.
指针的指针应该是
char   **p;

因为数组原则上也可以看成指针
所以数组的指针和指针的数组也可以说是指针的指针
不过数组是一类独特的指针,   指针是常量,   他指向的内容不能改变
比如,   他不可以被赋值
比如
int   array[10];
int   *p;
array   =   p;//错误,   array是常指针
p   =   array;//正确,   p是非常量指针

没问题,更详尽的解释:
(i)int   *p[3];  
(ii)int   (*q)[3];  
(iii)int   *(t[3]);  
以上三者的区别?
(加入了sizeof()操作),放在一起作如下总结(vc++环境下验证):  
(1)p是一个指针数组,此处包含三个整型指针,所以sizeof(p)=12;sizeof(*p)=4;//首地址  
     
(2)q是一个数组指针,指向含有三个元素的整型数组,所以sizeof(q)=4;sizeof(*q)=12;  

(3) 和(1)一样;sizeof(t)=12;sizeof(*t)=4;  

(4)   int   *p[3]等价于:typedef                 int*         myint;  
                                                                    myint     p[3];  
                                      int   (*p)[3]等价于:typedef           int         intarray[3];  
                                                                    intarray     *p;  
(5)   (i)可以这样初试化:int  a[]={1,2,3,4};  
                 p[0]=a;//*p=a;   
      (ii)可以这样初始化:int  a[3]={1,2,3};//数组元素必须是三个  
                  q =&a;  
(6)p是数组,不可做++操作,q是指针,可以做++操作,q++是当前q指向的地址值加12;  
阅读(1142) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~