C/C++ 指针使用、初始化

来源:互联网 发布:java中断机制 编辑:程序博客网 时间:2024/05/17 09:11

     首先,熟悉下*和&。

    

        *一般用在变量声明,像char * p;这样就声明了一个指针型变量,在声明的时候*靠近哪一方都行,例如:

char* p;char *p;char*p;

        这样都是可以的。

        但如果声明多个,就要注意下书写格式:

char *p,*k,*u;。

        声明之后就可以使用了。

        直接使用p,其实使用的是地址,而*p就是指向这个指针型变量所指内容,如果是数组则指向第一个元素,说到这拿sizeof()举个例子:

char *p="12345";char b[]="12345";printf("%d,%d,%d",sizeof(p),sizeof(*p),sizeof(b));//返回结果   4,1,6// sizeof(p) 取到的是数组首位1的地址,所以是4// sizeof(*p) 取到的是数组首位,所以是1// sizeof(b) 取到的才是整个数组,加上结束符0,所以是6
// char* 需要用strlen()才能取到整个数组的大小


     

        &是取地址操作符,也是参数引用操作符,

char t='a';char *p=&t;

        这样就把t的地址赋值到 指针型变量p里面了,也就是说现在t 和 p 是共有。改变其中一个另一个也会变,因为两者使用的是同一地址。

char t='a';char y='b';t=y;

        而这种直接赋值方式,使用的是原型中的复制构造函数,两者之间没有直接关系,其中一方改变也不会影响另一方。

        &还有一种使用就是在函数参数的引用上:

      

int(&) sub(int(&)arg1,int(&) arg2){      return (arg1-arg2);}
        在参数声明时加上&,其实就是实参和形参的区别。加上&之后会把原地址内容作为引用,而不加&会调用原型构造函数复制一份,再进行传递。

        形参好处在于即使参数在函数内改变,也不会影响原地址。而实参好处是不会复制原地址副本就减少了内存使用。通常在函数声明的时候,同时加上const和&,就会既不产生复制的副本,又不会影响原地址内容:

const int& sub(const int& a1,const int& a2){return a1-a2;};


        接下来是指针变量的初始化,先以char*为例:

char *p1;   /// 这只是声明了一个char指针,没有初始化不能使用。char *p2=new char[_MAX_PATH]; /// 声明并且初始化了一个大小_MAX_PATH的char指针,指针可变,内容可变。char *p3="12345";   /// 声明了一个char指针,并把它指向常量"12345",内容是不可改变的。但是可以继续指向其他地址const char *p4; ///常量内容,非常量指针,指针可变 char* const p5=new char[_MAX_PATH]; /// 常量指针,非常量内容,内容可变const char* const p6=new char[_MAX_PATH]; /// 常量指针,常量内容,都不可变
p1="34567";     /// 正确p1=p3;          /// 正确p3="56789";     /// 正确p4="76543";     /// 正确strcpy(p2,"11115"); ///正确strcpy(p5,"12225"); ///正确
strcpy(p4,"13335"); ///错误strcpy(p3,"14445"); ///错误strcpy(p1,"15555"); ///错误



0 0
原创粉丝点击