陆犯焉识

导航

C++二维数组、指针、对象数组、对象指针

项目中用到,随手记一下:

1.二维数组、与指针

创建二维数组指针的方式:

a.已知一维的大小

1 int **array=new int *[rows];
2 (for int i=0;i<rows;i++)
3     array[i]=new int[colums];

释放指针方式

1 for(int i=0;i<rows;i++)
2     delete array[i];
3 delete []array;

 b.两维都未知:

char **a;  
a = new char* [m];  
a[0] = new char[m * n];//一次性分配所有空间  
for(int i=1; i<m; i++)  
{  
    a[i] = a[i-1] + n;//分配每个指针所指向的数组  
}  
printf("%d\n", sizeof(a));//4,指针  
printf("%d\n", sizeof(a[0]));//4,指针  
delete[] a[0];  
delete[] a;  

对象 数组、对象指针的使用

  Date date[N];

  Date *p=date;//指向对象数组第一个位置的指针

参考连接:http://www.xuebuyuan.com/3183755.html

通过引用来传递数组

数组形参可以声明为数组的引用,如果形参是数组的引用,编译器不会把数组实参转化为指针,而是传递数组本身,这种情况下,数组大小成为形参和实参类型的一部分,编译器会检查数组的大小。

void printArr(int (&a)[10]) { /* ... */ }
int main(){
    int i = 0, j[2] = {0,1}, k[10] = {0};
    printArr(&i); // error!
    printArr(j); //error!
    printArr(k); // ok!
    return 0;
}

会严格检查数组的大小。

 

二级指针、与指针作为函数参数:

指针传参,虽然形参和实参会指向同样的内容,但是两个在内存中都会被分配地址,在用到二级指针时,若指向该指针的二级指针会出现不同结果。

 

void func(int *p)  
{  
    cout<<"func:&p="<<&p<<",p="<<p<<endl;  //note:3  
    p = &b;  
    cout<<"func:&p="<<&p<<",p="<<p<<endl;  //note:4  
}  

在调用func函数时

int a=10;b=100;
*q=a;
func(q);

q和p在内存中的地址是不同的,虽然二者刚开始都指向a,创建了一个副本;在执行p=&b之后;q的地址还是指向a;而p指向b;

编译器使 p = q(但是&p != &q,也就是他们并不在同一块内存地址,只是他们的内容一样,都是a的地址)。如果函数体内的程序修改了p的内容(比如在这里它指向b)。在本例中,p申请了新的内存,只是把 p所指的内存地址改变了(变成了b的地址,但是q指向的内存地址没有影响),所以在这里并不影响函数外的指针q。

posted on 2018-04-12 15:20  陆犯焉识  阅读(270)  评论(0编辑  收藏  举报