
项目中用到,随手记一下:
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[] = new char[m * n];//一次性分配所有空间
for(int i=; i<m; i++)
{
a[i] = a[i-] + n;//分配每个指针所指向的数组
}
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[]));//4,指针
delete[] a[];
delete[] a;
对象 数组、对象指针的使用
Date date[N]; Date *p=date;//指向对象数组第一个位置的指针
参考连接:http://www.xuebuyuan.com/3183755.html
通过引用来传递数组
数组形参可以声明为数组的引用,如果形参是数组的引用,编译器不会把数组实参转化为指针,而是传递数组本身,这种情况下,数组大小成为形参和实参类型的一部分,编译器会检查数组的大小。
void printArr(int (&a)[]) { /* ... */ }
int main(){
int i = , j[] = {,}, k[] = {};
printArr(&i); // error!
printArr(j); //error!
printArr(k); // ok!
return ;
}
会严格检查数组的大小。
二级指针、与指针作为函数参数:
指针传参,虽然形参和实参会指向同样的内容,但是两个在内存中都会被分配地址,在用到二级指针时,若指向该指针的二级指针会出现不同结果。
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=;b=;
*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。