指针和数组

误区

  • 数组名字有时候可以当做指针来用,但数组的名字不是指针,尽管数组使用自身的名字可以返回数组地址,但是名字本身不能作为赋值操作的目标。

一维数组

int vector[5];
printf("%d\n,sizeof(vector/sizeof(int));

二维数组

int matrix[2][3]={{1,2,3},{3,4,6}}
//如果只用一个下标访问数组,得到的是对应行的指针
forint i=0;i<2;i++)
{
printf("&matrix[%d]:%p  sizeof(matrix[%d]): %d\n",
        i,&matrix[i],i,sizeof(matrix[i]));
}
&matrix[0]:100  sizeof(matrix[0]): 12
&matrix[1]:112  sizeof(matrix[1]): 12

二位数组的内存映射:
在这里插入图片描述

多维数组

元素按照行-列-阶顺序连续分配。

指针表示法和数组

单独使用数组名字时会返回数组地址,我们可以把地址赋给指针。

int vector[5]={1,2,3,4,5};
int * pv=vector;
//pv变量是指向数组第一个元素而不是指向数组本身。
printf("%p\n",vector);
printf("%p\n",&vector[0]);
//上面两种方法是等效的
*(pv+i);
*(vector+i);
//上面两种也是等价的
/*****区别********/
sizeof(pv);        //返回4,就是指针的长度
sizeof(vector);  //返回5

vector=vector+1;  //语法错误,数组名字不是左值,不可以被修改。

使用指针的一维数组

int * arr[5];   //指针数组,里面存放着指针(int*型)
for(int i=0;i<5;i++)
{
//①
arr[i]=(int*)malloc(sizeof(int));
*arr[i]=i; //数组里面存放的指针解引
//②(arr+i)表示数组的第i个元素的地址
*(arr+i)=(int *)malloc(sizeof(int));
**(arr+i)=i;

//①==②
}

在这里插入图片描述

指针和多维数组

可以将多维数组的一部分看做子数组。
数组按行-列顺序存储。
在这里插入图片描述

int matrix[2][5]={{1,2,3,4,5},{6,7,8,9,10}};

/**声明一个指针来处理这个数组。**/
int (*pmatrix)[5]=matrix;
//先看括号里面声明了一个指针*pmatrix
//指针指向什么 int [5] ,一个含有5个整型的数组
//注意与上面的指针数组区分开

printf("%p/n",matrix);      100
printf("%p/n",matrix+1);    120
//matrix+1返回的地址偏移了第一行的长度

//二维数组是数组的数组
matrix[0]; //是一个长度为5的int型的数组的名字。
printf("%d/n",sizeof(matrix[0]));    20

//访问数组的第二个元素
*(matrix[0]+1);
printf("%p  %d \n",matrix[0]+1,*(matrix[0]+1);  104 2

//下面两个式子垂直变化,演化
//matrix、与&matrix[0][0]数值相等,但意义不同
//指向数组的指针,一个整数的指针
**(matrix+1)             **matrix+1**&a[0]+1)             **&a[0]+1*a[1]                    *(a[0]+1*&a[1][0]                *&a[0][1])
a[1][0]                      a[0][1]
6                              2

传递多维数组

要传递数组matrix,有两种办法:

//列数一定要明确
void haha(int (*hh)[5],int rows){}
void haha(int hh[][5],int rows){}

遇到形参为一个指针加行列的

void dispaly(int*arr,int rows,int cols)
{
   for(int i=0;i<rows;i++)
  {
      for(int j=0;j<cols;j++)
     {
        *(arr+(i*cols)+j); //只能用这样的办法
      }
   }
}
//这里没有将指针声明为二维数组,所以不能用数组下标来表示,只能用指针来表示。
dispaly(&matrix[0][0],2,5;

动态分配二维数组

//内存连续的分配方法1
int matrix[2][5]={{1,2,3,4,5},{6,7,8,9,10}};

//内存连续分配方法2,内存情况见下图
int rows=2;
int cols=5;
int **matrix=(int **)malloc(rows*sizeof(int*));
matrix[0]=(int*)malloc(rows*cols*sizeof(int));
for(int i=1;i<rows;i++)
    matrix[i]=matrix[0]+i*cols

在这里插入图片描述

//分配可能连续的内存,内存情况见下图
int rows=2;
int cols=5;

int**matrix=(int**)malloc(rows*sizeof(int*));

for(int i-0;i<rows;i++)
{
    matrix[i]=(int*)malloc(cols*sizeof(int)):
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值