二维数组与二维指针

二维数组与二维指针

二维数组在C语言中是以一维的方式线性存储的
二维数组中的第一维是一维数组,第二维才是真是值。
二维数组名也可以看成常量指针。
例如:char c[3][3];c[0]为一个数组,c[0][0]才是真实值。

#include<stdio.h>
Print_arr(int a[],int num) {
    int i;
    for(i=0;i<num;i++){
    printf("%d\n",a[i]);
    }
    }
int main(){
    int* p=NULL;
    int cc[3][3]={{1,2,3},{4,5,6}};
    p=&cc[0][0];

    Print_arr(p,9);
    return 0;
}

能打印出1.2.3.4.5.6.0.0.0说明二维数组是线性存储的

二维指针

#include<stdio.h>
int main(){

    int a=1;
    int* p=&a;
    int** pp=&p;
    printf("%d,%d\n",*p,**pp);
    return 0;
}

输出1,1

指针的本质也是变量,那么是变量就有传值调用和传址调用的区别,当传址调用时也就是要传入指针的地址——二维指针出现!
二维指针的用途之动态数组重分配

#include<stdio.h>
#include<malloc.h>

int reset(char** pp,int size,int new_size){

    int ret=1;
    int     i=0; 
    int len = 0;
    char* pt =NULL;
    char* tmp = NULL;
    char* p = *pp;
    if((pp!=NULL)&&(new_size > 0)){

        pt = (char*)malloc(new_size);
        tmp = pt;
        len= (size < new_size) ? size:new_size;
        for(i=0;i<len;i++){
            *tmp ++=*p++;
        }
        free(*pp);
        *pp = pt;
    }
    else{
        ret =0;

    }
    return ret;


}
int main(){
    char* p=(char*)malloc(5);

    printf("%p\n",p);

    if(reset(&p,5,3)){

    printf("%p\n",p);
    }
    return 0;

}

这里写图片描述

二维数组和数组指针

#include<stdio.h>
int main(){

    int a[5][5];
    int (* p)[4];
    p=a;
    printf("%d\n",&p[4][2]-&a[4][2]);
    return 0;
}

有警告,类型不匹配,导致输出为-4

C语言中只有一维数组,所有多维数组都可以看成一维数组,只不过一维数组内的类型变为数组了,二维数组的函数名是数组指针类型的,这种指针类型由其指向的数组大小和类型共同决定。如:int (p*)[5]

#include<stdio.h>
int main(int argc,char* argv[],char* env){

    int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
    int i,j;
    for(i=0;i<3;i++){

        for(j=0;j<3;j++){

        printf("%d\t",*(*(a+i)+j));
        }
    }
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值