指针和数组

int *a:一个int类型数据的指针

int *a;
int arr1[3]={4,9,18};//一维数组,arr1是数组名,存放arr1数组首元素地址
a=arr1;//a存放arr1数组首元素地址,指针或数组名+1,增加一个存储单元(int4个字节),指向arr1第二个元素的地址
a=&arr1[0];//a存放arr1数组首元素地址
int k=*a;//k存放arr1数组首元素-->k=4;

*和++优先级相同,遵守自右向左,所以a++,然后才是*a。
int total=*a++;是先指向a的地址(第一个元素地址),取值,再递增指针(a指向第二个元素地址)–>total=4,
int total=*++a;是先递增指针(a指向第二个元素地址),再取值–>total=9
int total=(*a)++;是先取值,再递增该值–>total=5

int *b[3]:指针数组,指向指针的数组,本质上是一个数组

  int *b[3];//数组里包含了3个指向int类型数据的指针
  int arr2[3]={5,10,45};//一维数组,arr2是数组名,存放arr2数组首元素地址
  b[0]=arr2;//b[0]存放数组arr2首元素的地址
  b[1]=&arr2[0];//b[1]存放数组arr2首元素的地址
  b[2]=&arr2[2];//b[1]存放数组arr2第三个元素的地址
  int x=*b[0];//x存放数组arr2首元素-->x=5
  int y=*b[1];//y存放数组arr2首元素-->y=5
  int z=*b[2];//y存放数组arr2第三个元素-->z=45
  int o=b[2]-b[1];//(指向同一个数组arr2) 指针-指针=指针所指向两个元素(45和5)的距离-->o=2(2个int)

int (*c)[3]:数组指针,指向数组的指针,本质上是一个指针

    int (*c)[3];//指针变量名是c,指向一个包含3个int类型数据的数组
    int arr3[3]={4,5,6};//一维数组,arr3是数组名,存放arr3数组首元素地址
    c=&arr3;//&arr3是指整个数组的地址(值与首元素地址相同,但意义不同)
            //执行c+1,就要跨过3个int类型数据的长度
            //执行&arr3+1,就要跨过3个int类型数据的长度
    //c=arr3错误,"="左边c是指向整个数组的指针,而右边arr3是指单个数组首元素地址,类型不一致
    int i=**c;//c是整个数组arr3的地址,c=&arr3
              //*c是数组arr3首元素地址,*c=arr3=&arr3[0]
              //**c才是数组arr3首元素,**c=arr3[0]
    int j=*(*c+1);//(*c+1)数组arr3第二个元素地址,*(*c+1)才是数组arr3第二个元素

int array[3][4]:二维数组与数组指针

二维数组首元素 array[0] 是一个包含了4个int类型数据的一维数组
&array[0]指这整个一维数组的地址, 一维数组名array[0]指该一维数组首元素地址,即&array[0][0]

int array[3][4];
  //二维数组名array是二维数组首元素的地址,即&array[0],是整个array[0]数组(包含了4个int类型数据)的地址
  //array+1,就要跨过4个int类型数据的长度,到二维数组第二个元素的地址,即&array[1]
  //一维数组名array[0]是该一维数组首元素地址,即&array[0][0],是单个int类型数据的地址
  //array[0]+1,就要跨过1个int类型数据的长度,到一维数组第二个元素的地址,即&array[0][1]
  
  //等价关系如下:
  //array[0]=&array[0][0]
  //*array[0]=array[0][0]
  
  //array=&array[0]
  //*array=&array[0][0] //*array,等价于array[0]的值,但array[0]的值等价于array[0][0]地址
  //**array=array[0][0] //array是地址的地址,必须两次才能获得原始值

int i=*(*(array+2)+1);//i=?
  //==*(*(&array[2])+1)
  //==*(array[2]+1)
  //==*(&array[2][0]+1)
  //==*(&array[2][1])
  //==array[2][1]
    
int (*d)[4];
    //d是一个指针变量名,指向一个包含4个int类型数据的数组
    //数组指针的长度4要与二维数组分解成多个一维数组,一维数组的长度(即二维数组的列数4)一样
    
d=array;//"="左边d是指向整个数组的指针,右边arrry是整个array[0]数组的地址,类型一致


//d虽然是一个指针,不是数组名,但是也可以使用d[0],d[0][0]这种写法
printf("%p\n",array);
printf("%p\n",array[0]);
printf("%p\n",d);
printf("%p\n",d[0]);
//可以用数组表示法和指针表示法表示一个数组元素
int i=*(*(array+m)+n);//i=array[m][n]
int j=*(*(d+m)+n);//j=array[m][n]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值