VC中的指针操作

None.gif
None.gif  指针使用灵活,但也最易犯错,当指针指定到错误的地址往往很不容易调试.
None.gif因此掌握指针的正确使用是C
++ 编程的一门基本功.
None.gif
None.gif   本文有关的指针操作:
None.gif   
// *1**********使用指针与地址运算符*************
None.gif    
// *p表示p地址内指示的内容,p表示存储地址. 
None.gif    
// 赋值时*p赋予所指变量的内容信息*p=a; 
None.gif    
// p用来赋予所指变量的地址信息p=&a.
None.gif    
// 输出时p用来输出所指变量的内容信息,&p用来输出p的地址信息.
None.gif    
None.gif    
// 指针类型在使用时,不可指向不存在的(void)位置,否则会造成不可预料的结果,
None.gif    
// 基本上指针遵循下述两种情况:
None.gif    
// 1.指向已存在的措针
None.gif    
// 2.要求分配内存自行使用(或内存管理)
None.gif
    UsePoints();
None.gif    
// *2**********指针地址运算*********************
None.gif    
// char *ch ; ch++;ch--;char类型在内存中占一个字节空间,地址增减量为1. 
None.gif    
// int *ptr; 4
None.gif    
// float *f; 4
None.gif    
// double *d; 8
None.gif    
// *p++;p++;*--p;*++p;(*p)++;(*p)--;
None.gif
    CalAddressOfPointer();
None.gif    
// *3**********指针的内存配置********************
None.gif    
// 配置单一内存
None.gif    
// 配置单一内存并赋值
None.gif    
// 配置多个内存,此种方式以指针当数组使用,又有固定大小或弹性大小.
None.gif
     PointerMemSet();
None.gif     
// *4*********指针变量与二维数组*****************
None.gif
     ArrayAndPointer();
None.gif     
// *5*********指针与函数*************************
None.gif     
// 一般变量传递参数给指针,再返回来.
None.gif
     VariMemberAndPointer();
None.gif     
// 传址方式传参数
None.gif     
// 使用地址运算符"&"也可实现,将数据从函数的参数部分返回参数.
None.gif
     VariAddAndFunction();
None.gif     
// 前两种方法的混合使用
None.gif
     VariAndPointer();
None.gif     
// 指针传给指针
None.gif     
// 大家都是指针,避免传递参数时使用地址运算符"&"不留神时造成的错误.
None.gif
     PointerAndPointer();
None.gif     
// 函数名称以指针返回
None.gif
     PointerFunction();
None.gif     
// *6******指针与结构******************************
None.gif
     PointerAndStruct();
None.gif     
// *7******指针的指针(双指针)**********************
None.gif
     DoublePointer();
None.gif     
// *8******以双重指针来赋值二维数组****************
None.gif
     DoublePointerAndArray();
None.gif     
// *9******指针指向函数****************************
None.gif
     PointerToFunction();
None.gif     
// *10*****指针数组********************************
None.gif
     PointerArray();
None.gif     
// *11*****字符数组与字符串的常数设置**************
None.gif
     CharArrayAndString();
None.gif     
// *12*****类的指针传递****************************
None.gif
     UseDataHelperArray();
None.gif
None.gif     详细代码:
None.gif
None.gif
// ***********使用指针与地址运算符*************
None.gif
// *p表示p地址内指示的内容,p表示存储地址. 
None.gif
// 赋值时*p赋予所指变量的内容信息*p=a; 
None.gif
// p用来赋予所指变量的地址信息p=&a.
None.gif
// 输出时p用来输出所指变量的内容信息,&p用来输出p的地址信息.
None.gif
// 指针类型在使用时,不可指向不存在的(void)位置,否则会造成不可预料的结果,
None.gif
// 基本上指针遵循下述两种情况:
None.gif
// 1.指向已存在的措针
None.gif
// 2.要求分配内存自行使用(或内存管理)
None.gif
void  UsePoints()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int x=10;
InBlock.gif    
int *p4;
InBlock.gif    cout
<<"**********************************"<<endl;
InBlock.gif    
//p4=x; //错误.将数值10赋给存储地址的指针是不对的.
InBlock.gif    
//*p4=x; //错误,p4还没有指向内存的地址,不能给它赋值.
InBlock.gif
    p4=&x;   //p4指向x的地址
InBlock.gif
    cout<<"x中的值   :"<<x<<endl;   //10  
InBlock.gif
    cout<<"x的地址   :"<<&x<<endl;  //0x0012FF28
InBlock.gif
    cout<<"p4中的内容:"<<p4<<endl;  
InBlock.gif    
//p4中保存了x在内存中的地址.即&x与p4值相同.p4保存了x的地址.
InBlock.gif
    cout<<"p4的地址  :" <<&p4<<endl; //p4的地址.与x的地址不同.
InBlock.gif
    cout<<"取出p4所指地址中的内容:"<<*p4<<endl; 
InBlock.gif    cout
<<"**********************************"<<endl;
InBlock.gif    
//指针赋值.
InBlock.gif    
//指针类型之间可以互相赋值,即可以使许多指针指向同一个地址.
InBlock.gif
    int *p1;
InBlock.gif    p1
=p4;
InBlock.gif    cout
<<"p1=p4操作"<<endl;
InBlock.gif    cout
<<"p1中的内容:"<<p1<<endl;  
InBlock.gif    
//p1中保存了x在内存中的地址.即&x与p1值相同.p1保存了x的地址.
InBlock.gif
    cout<<"p1的地址  :" <<&p1<<endl; //p1的地址.与x,p4的地址不同.
InBlock.gif
    cout<<"取出p1所指地址中的内容:"<<*p1<<endl; 
InBlock.gif    
InBlock.gif    cout
<<"P4要求分配4个字节的内存空间自行使用"<<endl;
InBlock.gif    p4
=new int//P4要求分配4个字节的内存空间自行使用.
InBlock.gif
    *p4=x; 
InBlock.gif    cout
<<"p4:"<<*p4<< " &x: "<<&<<" &p4: "<<&p4<<endl;  
InBlock.gif    
//值:10,0x0012FF28,0x0012FF24
InBlock.gif
    cout<<"**********************************"<<endl;
ExpandedBlockEnd.gif}

None.gif
// ***********指针地址运算*********************
None.gif    
// char *ch ; ch++;ch--;char类型在内存中占一个字节空间,地址增减量为1. 
None.gif    
// int *ptr; 4
None.gif    
// float *f; 4
None.gif    
// double *d; 8
None.gif    
// *p++;p++;*--p;*++p;(*p)++;(*p)--;
None.gif
void  CalAddressOfPointer()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    cout
<<"**********************************"<<endl;
InBlock.gif    
int *p,a=10;
InBlock.gif    p
=&a;
InBlock.gif    (
*p)++//表示先输出*p的内容后,再而p++.其主要原因是*运算符拥有最高优先级;
InBlock.gif
    cout<<"*p,a: "<< *p<<""<<a<<endl; //11,11 均增1.
InBlock.gif
    *p++;   //表示先输出*p中内容11后,再p中的地址加1.
InBlock.gif
    cout<<"*p++:"<<*p<<endl;//1244968(p+1地址中的数,因机而异.)
InBlock.gif
    *p--;   
InBlock.gif    cout
<<"*p--:"<<*p<<endl;//11.
InBlock.gif
    *++p;
InBlock.gif    cout
<<"*++p:"<<*p<<endl;//1244968(p+1地址中的数,因机而异.)
InBlock.gif
    *--p;
InBlock.gif    cout
<<"*--p:"<<*p<<endl;//11
InBlock.gif
    cout<<"**********************************"<<endl;
InBlock.gif    
//数组访问, p1++的使用.
ExpandedSubBlockStart.gifContractedSubBlock.gif
    int b[6]=dot.gif{1,2,3,4,5,6};
InBlock.gif    
int *p1=b;
InBlock.gif    
for(int i=0;i<6;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        cout
<<"各元素地址:"<<endl;
InBlock.gif        cout
<<"b["<<i<<"]"<<&b[i]<<endl;
InBlock.gif        cout
<<"*p1内容:"<<*p1<<endl;
InBlock.gif        cout
<<"p1地址:"<<p1<<endl;
InBlock.gif        cout
<<"++(*p1):"<<++(*p1)<<endl; 
InBlock.gif        
//先*p取出数据,然后对取出的数据加1.
InBlock.gif
        cout<<"(*p1)++:"<<(*p1)++<<endl;
InBlock.gif        cout
<<"p1地址:"<<p1<<endl;
InBlock.gif        p1
++;  //通过指针中的地址递增访问数组b中的数据.
ExpandedSubBlockEnd.gif
    }

InBlock.gif    cout
<<endl;
InBlock.gif    
//p1=b; 
InBlock.gif    
//
InBlock.gif
    p1=&b[0];
InBlock.gif    
for(int w=0;w<6;w++)
InBlock.gif        cout
<<p1++<<"  "<<*p1<<endl;
InBlock.gif    cout
<<"**********************************"<<endl;
InBlock.gif    
//字符数组的访问,*p3++的使用.
InBlock.gif
    char s2[10]="Morning";
InBlock.gif    
char *p3=s2;
InBlock.gif    cout
<<"一次输出一个字符"<<endl;
InBlock.gif    
int ilen=strlen(s2);
InBlock.gif    
//for(int j=0;j<ilen;j++)
InBlock.gif    
//
InBlock.gif
    while(*p3)
InBlock.gif        cout
<<*p3++<<","//M,o,r,n,i,n,g,
InBlock.gif
    cout<<endl;
InBlock.gif    cout
<<"**********************************"<<endl;
InBlock.gif    p3
=s2;
InBlock.gif    
for(int j=0;j<ilen;j++)
InBlock.gif        cout
<<p3++<<endl;   //输出p3所指的内容,非地址值;
InBlock.gif    
//Monrning,onrning,dot.gifg;
InBlock.gif
    cout<<"**********************************"<<endl;
InBlock.gif    
char s[10]="Howareyou";
InBlock.gif    
char *p2=s; //*p2中存储s的内容.
InBlock.gif    
//指针p2变量占用4个字节的存储空间,用来存储s的地址信息;
InBlock.gif
    cout<<"p2指原内容:"<<p2<< " &p2地址:"<<&p2<<" &s地址:"<<&s<<endl; 
InBlock.gif    
//Howareyou,OX0012FEF4,OX0012FEF8
InBlock.gif
    p2++;  //p2中存储的s地址信息加1.
InBlock.gif
    cout<<"p2++后内容:"<<p2<<" &p2地址:"<<&p2<<" &s地址:"<<&s<<endl; 
InBlock.gif    
//owareyou,OX0012FEF4,OX0012FEF8
InBlock.gif
    cout<<"**********************************"<<endl;
InBlock.gif    
char *str;
InBlock.gif    
if((str=(char*)malloc(21))==NULL)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        cout
<<"内存不足"<<endl;
InBlock.gif        exit(
1);
ExpandedSubBlockEnd.gif    }

InBlock.gif    strcpy(str,
"goodMorning");  //将goodMorning复制给str.
InBlock.gif
    strcpy(s,str);
InBlock.gif    cout
<<"所复制的数据为:"<<str<< endl;
InBlock.gif    cout
<<"长度:"<<strlen(str)<<endl;
InBlock.gif    cout
<<"**********************************"<<endl;
InBlock.gif    
//p2=str;
InBlock.gif    
//指针p2变量占用4个字节的存储空间,用来存储s的地址信息;
InBlock.gif
    cout<<"p2指原内容:"<<p2<< " &p2地址:"<<&p2<<" &s地址:"<<&s<<"s现在的值: "<<s<<endl; 
InBlock.gif    
//oodMorning,OX0012FEF4,OX0012FEF8,goodMoning
InBlock.gif
    p2++;  //p2中存储的s地址信息加1.
InBlock.gif
    cout<<"p2++后内容:"<<p2<<" &p2地址:"<<&p2<<" &s地址:"<<&s<<"s现在的值: "<<s<<endl; 
InBlock.gif    
//odMorning,OX0012FEF4,OX0012FEF8,goodMoning    
InBlock.gif
    free(str);
InBlock.gif    cout
<<"**********************************"<<endl;
InBlock.gif
ExpandedBlockEnd.gif}

None.gif    
// ***********指针的内存配置********************
None.gif    
// 配置单一内存
None.gif    
// 配置单一内存并赋值
None.gif    
// 配置多个内存,此种方式以指针当数组使用,又有固定大小或弹性大小.
None.gif
void  PointerMemSet()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gifcout
<<"**********************************"<<endl;
InBlock.gif
//配置单一内存    
InBlock.gif
 int *a,b;
InBlock.gif a
=new int;
InBlock.gif cout
<<"a的地址:"<<a<<endl;
InBlock.gif cout
<<"b的地址:"<<&b<<endl;
InBlock.gif 
*a=2;
InBlock.gif 
*a+=6;
InBlock.gif cout
<<setw(6)<<"*a+6="<<setw(6)<<*a<<endl;
InBlock.gif delete a;
InBlock.gifcout
<<"**********************************"<<endl;
InBlock.gif
InBlock.gif
//配置多个内存
InBlock.gif
int n;
InBlock.gifn
=16;
InBlock.gif
int *b3;
InBlock.gifb3
=new int[n];
InBlock.gif
int i=0;
InBlock.gif
for(i=0;i<n;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
*(b3+i)=rand()%16;
InBlock.gif    cout
<<*(b3+i)<<",";
ExpandedSubBlockEnd.gif}

InBlock.gifdelete [] b3;
InBlock.gifcout
<<endl;
InBlock.gifcout
<<"**********************************"<<endl;
InBlock.gif
//c语言中的malloc与free写法,#include<stdlib.h> 或#include<alloc.h>
InBlock.gif
//要注意内存大小的匹配 char: 1; int: 4;float: 4;
InBlock.gif
int *a2;
InBlock.gif
if((a2=(int *)malloc(6*sizeof(int)))==NULL)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    cout
<<"内存不足"<<endl;
InBlock.gif    exit(
1);
ExpandedSubBlockEnd.gif}
 //
InBlock.gif
//a2=(int *)malloc(17);//错误,配置17个字节的内存,非int类型所占内存的倍数.
InBlock.gif
for(i=0;i<6;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
*(a2+i)=rand()%16;
InBlock.gif    cout
<<*(a2+i)<<",";
ExpandedSubBlockEnd.gif}

InBlock.gifcout
<<endl;
InBlock.giffree(a2);
InBlock.gifcout
<<"**********************************"<<endl;
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
// **********指针变量与二维数组*****************
None.gif
void  ArrayAndPointer()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    cout
<<"**********************************"<<endl;
InBlock.gif    
//指针变量与二维数组
InBlock.gif
    const int w=3,y=4;  //注意要定义为const,以便后面的int a[i][j]使用;
InBlock.gif
    int a[w][y],*p;
InBlock.gif    
int i=w,j=y;
InBlock.gif    p
=&a[0][0];  //p中只保存有a[0][0]的地址,p+m是地址值增加.
InBlock.gif
    int m=0;
InBlock.gif    cout
<<"&p="<<&p<<endl;
InBlock.gif    
for(m=0;m<w*y;m++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
*(p+m)=rand()%12;
InBlock.gif        cout
<<*(p+m)<<" ";
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    cout
<<endl<<"数组内容为"<<endl;
InBlock.gif    
InBlock.gif    
InBlock.gif    
for(m=0;m<3;m++)
InBlock.gif            
for(int n=0;n<4;n++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                cout.width(
3); //设置输出的字符宽度
InBlock.gif
                cout<<*(*(a+m)+n)<<"  ";
ExpandedSubBlockEnd.gif            }

InBlock.gif    cout
<<endl<<"&p="<<&p<<endl;
InBlock.gif
InBlock.gif    
//delete p;
InBlock.gif
    cout<<"**********************************"<<endl;
ExpandedBlockEnd.gif}

None.gif
// *5*********指针与函数*************************
None.gif
// 函数与指针的可能组合
None.gif
声明         调用            函数定义               说明
None.gif
int  a;       fc1( & a,dot.gif);     void  fc1( int   * a,dot.gif)   指针参数返回
None.gif
int  a;       fc1(a,dot.gif);      void  fc1( int   & a,dot.gif)   指针参数返回
None.gif
int   * a;      fc1(a,dot.gif);      void  fc1( int   * a,dot.gif)   指针参数返回
None.gif
int   * a;      a = fc1(dot.gif);      int    * fc1(dot.gif)         函数名返回
None.gif
int   * a, * b;   a = fc1(b,dot.gif);    int    * fc1( int   * b,dot.gif)  函数名返回,指针参数返回
None.gif
// 一般变量传递参数给指针,再返回来.
None.gif
int   Cal_data( int   * a, int   * b)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int t;
InBlock.gif    t
=*a+100;
InBlock.gif    
*a=*b;
InBlock.gif    
*b=t+200;
InBlock.gif    
return *b;
ExpandedBlockEnd.gif}

None.gif
int  VariMemberAndPointer()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int a,b;
InBlock.gif    a
=10;
InBlock.gif    b
=16;
InBlock.gif    cout
<<"运算前:  a="<<a<<" b= "<<b<<endl;
InBlock.gif    cout
<<Cal_data(&a,&b)<<endl ; //将两个变量的地址传给参数.
InBlock.gif
    cout<<"运算后:  a="<<a<<" b= "<<b<<endl; //a=16,b=310;
InBlock.gif
    return 1;
ExpandedBlockEnd.gif}

None.gif
None.gif
// ***********************************
None.gif
// 传址方式传参数
None.gif
// 使用地址运算符"&"也可实现,将数据从函数的参数部分返回参数.
None.gif
// 通过指针与引用进行数据传递,可使程序在调用函数上更为灵活,但必须注意
None.gif
// 传递参数的相互关系
ExpandedBlockStart.gifContractedBlock.gif
/**/ /
None.gif 主程序调用                   函数定义
None.gif
int  a, * b;
None.giffc1(
& a);         ->             void  fc1( int   * a)
None.giffc1(a);         
->            VOID fc1( int   & a)  
None.giffc1(b);         
->            VOID fc1( int   * b)  
ExpandedBlockStart.gifContractedBlock.gif
/**/ /
None.gif int   Cal_data( int   & , int   & ); // 先声明
None.gif

None.gif 
int  VariAddAndFunction()
ExpandedBlockStart.gifContractedBlock.gif 
dot.gif {
InBlock.gif     
int a,b;
InBlock.gif     a
=10;
InBlock.gif     b
=16;
InBlock.gif     cout
<<"运算前:  a="<<a<<" b= "<<b<<endl;
InBlock.gif     cout
<<Cal_data(a,b)<<endl ; //将两个变量的地址传给参数.
InBlock.gif
     cout<<"运算后:  a="<<a<<" b= "<<b<<endl; //a=16,b=310;
InBlock.gif
     return 1;
ExpandedBlockEnd.gif }

None.gif 
int   Cal_data( int   & a, int   & b)
ExpandedBlockStart.gifContractedBlock.gif 
dot.gif {
InBlock.gif     
int t;
InBlock.gif     t
=a+100;  //不能使用t=*a+100; *a为指针类型.
InBlock.gif
     a=b;
InBlock.gif     b
=t+200;
InBlock.gif     
return b;
ExpandedBlockEnd.gif }

None.gif
// *********************************************
None.gif
// 前两种方法的混合使用
None.gif
int   Cal_data( int   & a, int   * b);
None.gif  VariAndPointer()
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {
InBlock.gif      
int a,b;
InBlock.gif      a
=10;
InBlock.gif      b
=16;
InBlock.gif      cout
<<"运算前:  a="<<a<<" b= "<<b<<endl;
InBlock.gif      cout
<<Cal_data(a,&b)<<endl ; //将两个变量的地址传给参数.
InBlock.gif
      cout<<"运算后:  a="<<a<<" b= "<<b<<endl; //a=16,b=310;
InBlock.gif
      return 1;  
ExpandedBlockEnd.gif  }

None.gif  
int   Cal_data( int   & a, int   * b)
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {
InBlock.gif      
int t;
InBlock.gif      t
=a+100;  //不能使用t=*a+100; *a为指针类型.
InBlock.gif
      a=*b;
InBlock.gif      
*b=t+200;
InBlock.gif      
return *b;
ExpandedBlockEnd.gif  }

None.gif  
// 指针传给指针
None.gif  
// 大家都是指针,避免传递参数时使用地址运算符"&"不留神时造成的错误.
None.gif
   int  Get_Data( int   * a, int   * b)
ExpandedBlockStart.gifContractedBlock.gif  
dot.gif {
InBlock.gif     
InBlock.gif      
*a=10;
InBlock.gif      
*b=20;
InBlock.gif      
return *b;
ExpandedBlockEnd.gif  }

None.gif
int  PointerAndPointer()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int *a,*b;
InBlock.gif
InBlock.gif    a
=new int;
InBlock.gif    b
=new int;
InBlock.gif    cout
<<Get_Data(a,b);
InBlock.gif    cout
<<"取出a,b的值"<<*a<<"  "<<*b<<endl;
InBlock.gif    delete a;
InBlock.gif    delete b;
InBlock.gif    
return 1;
ExpandedBlockEnd.gif}

None.gif
// 函数名称以指针返回
None.gif
int   * Get_data1( int  , int );
None.gif
int   * Get_Array();
None.gif
char   * Get_String();
None.gif
int  PointerFunction()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int a=10,b=20,*p;
InBlock.gif    p
=Get_data1(a,b); 
InBlock.gif    cout
<<"p="<<*p<<endl;
InBlock.gif    delete p;
InBlock.gif
InBlock.gif    
int *p2=new int[11];
InBlock.gif        cout
<<"&p2="<<&p2<<endl;
InBlock.gif    p2
=Get_Array();
InBlock.gif    cout
<<"p2=";
InBlock.gif    
for(int i=0;i<9;i++)
InBlock.gif    cout
<<*p2++<<",";
InBlock.gif    cout
<<"&p2="<<&p2<<endl;
InBlock.gif
InBlock.gif    cout
<<endl;
InBlock.gif    
int j=0;
InBlock.gif    
for ( j=0;j<9;j++)
InBlock.gif        
//*p2--;
InBlock.gif
    cout<<"&p2="<<*p2--<<endl;  //一定要加上此句.
InBlock.gif
    delete [] p2;
InBlock.gif    
char *p3=new char[13];
InBlock.gif    cout
<<"&p3="<<&p3<<endl;
InBlock.gif    p3
=Get_String();
InBlock.gif    cout
<<"p3="<<p3<<endl;
InBlock.gif    cout
<<"&p3="<<&p3<<endl;
InBlock.gif    
int x=sizeof(p3);
InBlock.gif    cout
<<"p3长度"<<x<<endl;
InBlock.gif    
for (j=0;j<13;j++)
InBlock.gif    cout
<<"&p3="<<p3--<<endl;
InBlock.gif    
//delete [] p3;
InBlock.gif
    return 1;
ExpandedBlockEnd.gif}

None.gif
int   * Get_data1( int  a, int  b)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int *p=new int(a+b);
InBlock.gif    
return p;
ExpandedBlockEnd.gif}

None.gif
int   * Get_Array()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int *p=new int[11];
InBlock.gif    
for(int i=0;i<9;i++)
InBlock.gif        
*(p+i)=i*2;
InBlock.gif    
return p;
ExpandedBlockEnd.gif}

None.gif
char   * Get_String()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
char *p=new char[13];
InBlock.gif    p
="good morning";
InBlock.gif    
return p;
ExpandedBlockEnd.gif}

None.gif
// 指针与结构
None.gif
typedef  struct  student
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
char name[4];
InBlock.gif
char sex;
InBlock.gif
int age;
ExpandedBlockEnd.gif}
_student;
None.gif
void  get_student(student  * a)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
InBlock.gif    a
->name[0='b';
InBlock.gif    a
->name[1='l';
InBlock.gif    a
->name[2='g';
InBlock.gif    a
->name[3='c';
InBlock.gif
InBlock.gif    a
->sex ='f';
InBlock.gif    a
->age =23;
ExpandedBlockEnd.gif}

None.gif
int  PointerAndStruct()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   student blgc;
InBlock.gifget_student(
&blgc);
InBlock.gifcout
<<"name="<<blgc.name <<endl;
InBlock.gifcout
<<"sex="<<blgc.sex  <<endl;
InBlock.gifcout
<<"age="<<blgc.age  <<endl;
InBlock.gif
InBlock.gif
return 1;
ExpandedBlockEnd.gif}

None.gif
// 指针的指针(双指针)
None.gif
int  DoublePointer()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
//*p  地址->内容
InBlock.gif    
//**p 地址->地址->内容
InBlock.gif
    int x,*p,**p2;
InBlock.gif    x
=100;
InBlock.gif    p
=&x;
InBlock.gif    p2
=&p;
InBlock.gif    cout
<<"*p="<<*p<<endl;  //100
InBlock.gif
    cout<<"&p="<<&p<<endl;  //0x0012FF24
InBlock.gif
    cout<<"*p2="<<*p2<<endl; //0x0012FF28
InBlock.gif
    cout<<"**p2="<<**p2<<endl; //100
InBlock.gif
    return 1;
ExpandedBlockEnd.gif}

None.gif
// 以双重指针来赋值二维数组
None.gif
// 先要求行的指针,再以行的指针来赋值列的指针,使行为第一指针,
None.gif
// 列为第二指针,形成数组的数组,其访问方式可用一般数组的访问方式.
None.gif
const   int  row = 2 ;
None.gif
const   int  col = 3 ;
None.gif
int  Get_Array( float   ** data)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    srand((unsigned)time(NULL));
//启动随机函数生成器
InBlock.gif
    randomize();
InBlock.gif    
int temp=0;
InBlock.gif    
for(int i=0;i<row;i++)
InBlock.gif        
for(int j=0;j<col;j++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            temp
=random(10); //产生0-9的随机数
InBlock.gif
            data[i][j]=(float)temp;
ExpandedSubBlockEnd.gif        }

InBlock.gif           
return 1;
ExpandedBlockEnd.gif}

None.gif
void  Display( float   ** data)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
for(int i=0;i<row;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
for(int j=0;j<col;j++)
InBlock.gif            cout
<<data[i][j]<<" ";
InBlock.gifcout
<<endl;
ExpandedSubBlockEnd.gif}

InBlock.gif
ExpandedBlockEnd.gif}

None.gif
void  Dispose( float   ** data)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
for(int i=0;i<row;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        delete [] data[i]; 
//释放列
ExpandedSubBlockEnd.gif
    }

InBlock.gif    delete [] data; 
//释放行
ExpandedBlockEnd.gif
}

None.gif 
None.gif
int  DoublePointerAndArray()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif
float **data;
InBlock.gif
try
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    data
=new float *[row];  //配置行
InBlock.gif
    for(int j=0;j<row;j++)
InBlock.gif        data[j]
=new float[col]; //配置列
InBlock.gif
    throw(1); //自定义抛出一个异常数字1.
ExpandedSubBlockEnd.gif
}

InBlock.gif
catch(int err)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
if(err!=1)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        cout
<<"内存不足,"<<endl;
InBlock.gif        exit(
-1);
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockEnd.gif}

InBlock.gifGet_Array(data);
InBlock.gifDisplay(data);
InBlock.gifDispose(data); 
//释放内存
InBlock.gif
return 1;
ExpandedBlockEnd.gif}

None.gif
// 指针指向函数
None.gif
// 函数虽然不是变量,但它仍然在内存中有实际地址,故可以将指针指向该地址.
None.gif
// 要取得函数地址,只要将函数名称赋值给指针变量,而不用任何括号或参数,就
None.gif
// 象数组的地址赋值给指针变量一样.
None.gif
double  xpowxy( double , double , double ( * xy)( double , double ));
None.gif
double  add( double  x , double  y);
None.gif
int  PointerToFunction()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
//指针指向pow函数,用以求x的y次方值.
InBlock.gif
    double x,y;
InBlock.gif    
double (*p)(double,double);
InBlock.gif    
//p=pow;
InBlock.gif
    p=add;
InBlock.gif    x
=10;
InBlock.gif    y
=2;
InBlock.gif    
//cout<<"x^y="<<xpowxy(x,y,p)<<endl;
InBlock.gif
    cout<<"x+y="<<xpowxy(x,y,p)<<endl;
InBlock.gif    
return 1;
ExpandedBlockEnd.gif}

None.gif
double  xpowxy( double  x, double  y, double ( * xy)( double  , double ))
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
return xy(x,y);
ExpandedBlockEnd.gif}

None.gif
None.gif
double  add( double  x , double  y)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
return x+y;
ExpandedBlockEnd.gif}

None.gif
None.gif
// 指针数组
None.gif
int  PointerArray()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int *p[6],i=0;
InBlock.gif    
for(i=0;i<6;i++
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        p[i]
=new int(i*2); //分配内存空间,赋初值.
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
for(i=0;i<6;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        cout
<<*p[i]<<endl;  //输出结果
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
for(i=0;i<6;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        delete p[i]; 
//释放资源
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
return 1;
ExpandedBlockEnd.gif}

None.gif
// 字符数组与字符串的常数设置
None.gif
const   int  N = 6 ;
None.gif
int  CharArrayAndString()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int i;
ExpandedSubBlockStart.gifContractedSubBlock.gif    
char s[N]=dot.gif{'a','b','c','d','e'}//纯字符数组非字符串,没有结束符'\0'
InBlock.gif

ExpandedSubBlockStart.gifContractedSubBlock.gif    
char st[N+1]=dot.gif{'A','B','C','D','E','\0'};    //纯字符数组的字符串
InBlock.gif
    char str[]="ABCDE";
InBlock.gif    
char *string="ABCDE";
InBlock.gif    cout
<<"字符数组输出s[N]=";
InBlock.gif    
for (i=0;i<N;i++)
InBlock.gif        cout 
<< s[i];
InBlock.gif    cout 
<< endl;
InBlock.gif    cout 
<<"字符串输出st[N+1]="<<st<<endl;
InBlock.gif    cout 
<<"字符串输出str[]="<<str<<endl;
InBlock.gif    cout 
<<"字符串输出*string="<<string<<endl;
InBlock.gif    
return 1;
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
class  DataHelper
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
private :
InBlock.gif    
int x;
InBlock.gif    
int a[10];
InBlock.gif    
InBlock.gif
public :
InBlock.gif    
int *Group1[20];
InBlock.gif    
static int Group2[20];
InBlock.gif    
int Group3[20];
InBlock.gif    
int y;
InBlock.gif    
static int z;
InBlock.gif    DataHelper();
InBlock.gif    
int GetGroup1();
InBlock.gif    
int SetGroup2(int b[20]);
ExpandedBlockEnd.gif}
;
None.gif
None.gif
int  DataHelper::z ;  // 静态成员声明,切记.
None.gif
int  DataHelper::Group2[ 20 ]; 
None.gifDataHelper::DataHelper()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    x
=10;
InBlock.gif    y
=-1;
InBlock.gif    z
=-1;
InBlock.gif    
for(int i=0;i<20;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        Group1[i]
=new int(-1);
InBlock.gif        Group2[i]
=-1;
ExpandedSubBlockEnd.gif    }

InBlock.gif    memset(Group3,
-1,sizeof(Group3));
ExpandedBlockEnd.gif}

None.gifDataHelper::SetGroup2 (
int  b[ 20 ])
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif    
for(int i=0;i<20;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      Group2[i]
=b[i];
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return 1;
ExpandedBlockEnd.gif}

None.gif
int  UseDataHelperArray()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    DataHelper 
*dh;
InBlock.gif
InBlock.gif
InBlock.gif    dh
=new DataHelper();
InBlock.gif    
*(dh->Group1[0])=10;
InBlock.gif    
*(dh->Group1[0])=20;
InBlock.gif    dh
->y=20;
InBlock.gif    DataHelper::z
=100;
InBlock.gif
InBlock.gif    
int a[20];
InBlock.gif    
InBlock.gif    memset(a,
100,sizeof(a));
InBlock.gif    dh
->SetGroup2(a) ;
InBlock.gif    DataHelper::Group2[
0]=100;
InBlock.gif    
InBlock.gif    cout
<<"dh->y="<<dh-><<endl;
InBlock.gif    cout
<<"dh->Group1[0]="<<*(dh->Group1[0])<<endl;
InBlock.gif    cout
<<"dh->Group1[1]="<<dh->Group1[1]<<endl;
InBlock.gif    cout
<<"DataHelper::z"<<DataHelper::z<<endl;
InBlock.gif    cout
<<endl<<endl;
InBlock.gif    
InBlock.gif    cout
<<"dh2->Group2[0]="<<DataHelper::Group2[0]<<endl;
InBlock.gif
InBlock.gif    DataHelper 
*dh2;
InBlock.gif    dh2
=new DataHelper;
InBlock.gif    cout
<<endl<<endl;
InBlock.gif    
InBlock.gif    cout
<<"dh2->Group1[1]="<<dh2->Group2[1]<<endl;
InBlock.gif   
InBlock.gif    
return 1;
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
None.gif
None.gif#include 
< iostream.h > // cout,cin
None.gif
#include  < iomanip.h > // setw()
None.gif
#include  < conio.h >   // getch()
None.gif
# include  < stdio.h >
None.gif# include 
< stdlib.h >
None.gif# include 
< string .h >
None.gif# include 
< time.h >
None.gif# include 
< math.h >   // pow(x,y)
None.gif
#define  randomize() srand((unsigned) time(NULL))
None.gif
#define  random(x) rand()%x
None.gif
// #include <alloc.h>
None.gif
#include  < process.h >
None.gif
// #include <except.h>
None.gif
None.gif
// 指针使用灵活,但也最易犯错,当指针指定到错误的地址往往很不容易调试.
None.gif
// 因此掌握指针的正确使用是C++编程的一门基本功.
None.gif
None.gif
// **************
None.gif
// 指针类型在使用时,不可指向不存在的(void)位置,否则会造成不可预料的结果,
None.gif
// 基本上指针遵循下述两种情况:
None.gif
// 1.指向已存在的措针
None.gif
// 2.要求分配内存自行使用(或内存管理)
None.gif
// ***************
None.gif
// 指针下标超出数组范围
None.gif

None.gif
posted on 2006-08-25 17:00 DotNet编程 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/furenjun/archive/2006/08/25/486377.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值