通过数组和指针结合延伸出数组指针

定义和引用数组指针

二维数组

其概念方法和 @一维数组 类似 例如

定义一个二维数组

int str[3][6];
第一维有3个元素  第二维有6个元素 每一维用花括号括起来。

二维数组的含义

int str[3][6];
定义一个str指向的类型是 int 的 数组变量  并且具有三行六列的元素大小 
也就是说 一行有六列 一共有三行  18个元素大小 

二维数组的初始化方式

(1)分行对二维数组初始化赋值

      int str[3][6]= {{1,2,3,4,5,6},
                 {7,8,9,10,11,12,13},
                 {14,15,16,17,18,19}
                }; 
                

这种方法比较直观 第一个花括号的元素给第一行 第二个花括号的元素给第二行 … 就是这样赋值

(2)可以将所有元素就用一个花括号括起来 系统会根据你定义的数组行数列数进行平均分配

 int str[3][6]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};

(3)对部分赋值 没赋值的自动补o

int str[3][6]={{1},{5},{2}};
赋值过程 
 1 0 0 0 0 0
 5 0 0 0 0 0
 2 0 0 0 0 0

(4)全部赋值为0

int str[3][6]={0};

也就是全部元素都为0了

二维数组的访问方式

 访问的格式  数组名[i][j];i和j 都是从零开始算的 
 也就是我们所说的下标法访问 

二维数组的引用

#include <stdio.h>
void main(void)  //定义一个无参无返回类型主函数
{
  int str[3][6]= {{1,2,3,4,5,6},
                 {7,8,9,10,11,12,13},
                 {14,15,16,17,18,19}
                }; 
  printf(“访问第1行第1列对应的元素%d\n”,str[0][0]);
  printf(“访问第1行第2列对应的元素%d\n”,str[0][1]);
  printf(“访问第1行第3列对应的元素%d\n”,str[0][2]);
  printf(“访问第1行第4列对应的元素%d\n”,str[0][3]);
}

二维数组的访问注意事项
访问的时候 以上的例子为参考 并不会访问到arr[3][6]的元素 因为我们从0开始访问元素的

指针变量

定义一个指针变量 @指针变量

int *p;//定义一个指针变量 指针指向int类型 是一个int类型的指针变量
P=NULL;//向左赋值给指针 初始化指针

数组指针

能不能定义一个指针,让指针偏移的时候 也同等于数组名偏移得到同样对应的数组元素大小

二维数组名的偏移 也就是 行的偏移 @数组名 行名 列名 三个的联系
代码演示

#include<stdio.h>

//0行0列是一个地址  0行1列也是个地址 每个地址都是 int类型

void main(void)
{
    int arr[2][2]={{12,13},{14,15}};

    printf("首行地址%p\n",arr[0]);
    printf("第2行地址%p\n",arr[1]);


}

运行结果

在这里插入图片描述

用行首地址 和偏移了一行的地址 对比 为什么会产生这样结果

因为 0行0列是一个地址 0行1列也是个地址 每个地址都是 int类型 并且定义了 一行有两个元素 所以是 偏移了 2*4个字节

数组加入指针变量

#include<stdio.h>

//0行0列是一个地址  0行1列也是个地址 每个地址都是 int类型

void main(void)
{
    int arr[2][2]={{12,13},{14,15}};
   int (*p)[2];
     p=arr;
    printf("首行地址%p\n",arr[0]);
    printf("第2行地址%p\n",arr[1]);
printf("*********************************");
    printf("指针首地址%p\n",p);
    printf("指针偏移地址%p\n",++p);

}

运行结果

在这里插入图片描述

出奇一致 为什么呢

 首先 0061FF0C +2*4 =0061FF14  
 加的过程 +DEF01234  刚刚好 2*4个字节 

(出现的原因)特别注意

通过上面两个例子  我们可以知道 数组指针是名副其其实意义上等同于维数组名的
当数组名偏移 就是行名偏移 等效于数组指针中的 指针偏移 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值