代码改变世界

typedef声明数组及在二维数组申请中的应用

2012-03-12 16:48  钱吉  阅读(1305)  评论(0编辑  收藏  举报

基础知识练习,随便写写,关于指针,数组,typedef的应用. 

#define MAXLINE 1024
typedef char Pom[MAXLINE];
int main()
{
    char *pTest[10] = {"abcd","defg"};//指针数组初始化
    char MyArray[MAXLINE] = {"hello,world!"};
    char *p1 =MyArray;
    char **p2 = &p1;//指针的指针。pp3=&pp是错的,&pp为数组地址,&pp+1将指向数组的最后,即加一相当于指针移动数组长度
    Pom *Vec = (Pom*)pTest;

    char *p3; //p3指向内存某一区域
    Vec = (Pom*)p3;//强制转换,默认将p3指向的内存指定为数组区域,从p3指向的1024字节必须初始化,否则非法访问!

    Vec = (Pom*)p1;//相当于Pom *Vec = (Pom*)MyArray;
    printf("%s\n",*p1+1);//*p1指向数组pp的首地址。
    char (*p)[MAXLINE];
    Vec = p;//数组指针,与Pom*等价
    //p = p3; error:无法从“char *”转换为“char (*)[1024]”,这个是常容易范的毛病


    Pom *temp = new Pom[2];//temp->char[2][1024];
    strcpy(*temp, "abcd");//temp相当于是二位数组的指针。
    printf("%s\n",*temp);//result:abcd;
    printf("%s\n",*temp+1);//result:bcd;移动到第一行的第二列

    strcpy(*(temp+1), "efgh");
    printf("%s\n",*(temp+1));//result:efgh,移动到第二行的开始

    //strcpy(*(temp+2), "ijkl\0");//visit access!

    delete []temp;
    printf("%s\n",*temp);//内存已经释放,无法访问!原本以为会造成内存泄露,没想到已经释放了,说明用new事情的Pom类型内存块被看成是一维数组。如果是照一些古老

    //办法,用两个循环去申请二维数组,到头来你还要去写一个循环去释放行数组,和列数组指针。

    int na,nb;
    char **pBiArray1 = new char*[2];
    for (na=0; na<2; na++)
    {
        *(pBiArray1+na) = new char[3];
    }
    //print the address
    for (na=0; na<2; na++)
    {
        for (nb=0; nb<3; nb++)
        {
            printf("%x\t",&pBiArray1[na][nb]);
        }
        printf("\n");
    }
    //free
    for (na=0; na<2; na++)
    {
        delete []pBiArray1[na];
    }
    delete []pBiArray1;
}