022day(指针和数组和指向指针的指针)

来源:互联网 发布:淘宝一口价设置技巧 编辑:程序博客网 时间:2024/06/15 08:06

172210704111-陈国佳总结《2017年11月1日》【连续022天】

标题:指针和数组和指向指针的指针;

内容:A.观看MOOC8.5,9.1;

            B.(a).指针与数组:数组的名字是一个指针常量,指向数组的起始地址;

T a[N]:     a的类型是T*;可用a给一个T*类型的指针赋值;a是常量,不能赋值

作为函数形参时,T*p 和 T p[ ]等价;

例: int a[200]; int*p;
p=a; //让p指向数组a的起始地址a[0]; 
*p=10;  //让a[0]=10; 
*(p+1)=20;  //让a[1]=20; 
p[0]=30;   //让a[0]=30 ; p[i]等效于*(p+i); 
p[4]=40; 
for(int i =0;i<10;++i)
*(p+i)=i;     //对a数组的前10个元素进行赋值; 
++p;      //让p指向a[1]; 
cout<<p[0]<<endl; 
p=a+6;    //p指向a[6;] 
cout<<*p<<endl;
return 0;


例2:void Reverse(int*p,int size){  //颠倒一个数组 
for(int i=0;i<size/2;++i){
int tmp =p[i];
p[i] =p[size-1-i];
p[size-1-i]=tmp; 
    }
}
int main()
{
int a[5]={1,2,3,4,5};
Reverse(a,sizeof(a)/sizeof(int));
for(int i=0;i<5;++i){
cout<<*(a+i)<<",";

运行结果:


注明:以前提及函数中,形参是实参的拷贝,形参的改变不会影响实参;但数组特殊,其实质:将数组看作指针,经过函数后,其指向的地址不变,但内容发生了改变;

故形参依旧是实参的拷贝;

              (b).定义二维数组:T a[m][n];

a[i]是一个一维数组(其中i是整数);a[i]的类型是T*;sizeof(a[i]) =sizeof(T)*N

a[i]指向的地址: 数组a的起始地址+i*N*sizeof(T)

应用上面的颠倒函数:

例:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
Reverse(a[1],4);
for(int i=0;i<=2;++i){
for(int j=0;j<=3;++j)
cout<<a[i][j]<<" ";
}
Reverse(a[1],6);
cout<<endl;
    for(int i=0;i<=2;++i){
for(int j=0;j<=3;++j)
cout<<a[i][j]<<" ";
}


可见,因为二维数组的数据是连续存放的,当超出a[1]时,函数会调用后面的数据,即a[2];

指向指针的指针:

定义:T ** p;

p是指向指针的指针,即p指向一个类型为T*指针的地方;*p 的类型为 T*;

实际运用:

        int **pp; //指向int*类型指针的指针
int*p;
int n=1234;
p =&n; //p指向n 
pp =&p;  //pp指向p
cout<<*(*pp)<<endl; //*pp是p,*(*pp)是n 


明日计划:学习指针与字符串;





原创粉丝点击