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。