首页 > 其他分享 >二维数组、数组指针以及指针数组

二维数组、数组指针以及指针数组

时间:2022-12-29 18:00:22浏览次数:36  
标签:int 二维 数组 printf 指针 buff

 1.二维数组定义

    格式:数据类型 数组名[行][列];

    示例:int buff[3][5];

    第一个[3] 表示二维数组buff中有3个一位数组

    第二个[5] 表示每个一维数组中有5个成员。

    若二维数组定义时进行初始化则第一个[]可以不填。第二个[]不能省略。

    buff表示第0行的整体地址。即:&buff[0], buff类型为:int (*)[5]

    buff[0]表示第0行的首地址。即:&buff[0][0], buff[0]类型为int *

    buff[0][0]表示第0行第0列的值。

  • 示例:
int buff[][3]={1,2,3,4,5,6};//每行有3个元素
int buff2[][3]={
{1,2,3},
{4,5,6},
};
//部分初始化,数组中未赋值的默认为0
int buff3[][3]={
{1,2,3,},
{},
{4,5,6},
};
//初始化自动计算行数,数组中未赋值的默认为0
int buff3[][3]={
{},
{},
{},
};
int buff[3][3];//定义二维数组直接限制行、列,未初始化成员为随机值
  •  二维数组遍历

​示例一:

int main()
{
int buff[][3]={1,2,3,4,5,6};//每行有3个元素
int i,j;
for(i=0;i<sizeof(buff)/sizeof(buff[0]);i++)
{
for(j=0;j<sizeof(buff[0])/sizeof(int);j++)
{
printf("%d ",buff[i][j]);
}
printf("\n");
}
}

二维数组、数组指针以及指针数组_二维数组

示例二:通过指针方式遍历

#include <stdio.h>
int main()
{
int buff[][3]={1,2,3,4,5,6};//每行有3个元素
int *p=buff[0];
int i;
for(i=0;i<sizeof(buff)/sizeof(int);i++)
{
printf("%d ",*);
}
}

 2.二维数组作为形参处传入

  • ​以数组方式传入

     将二维数组作为形参传入,二维数组作为形参时,必须指定列宽。

#include <stdio.h>
void tow_array(int buff[][3],int line);
int main()
{
int buff[][3]={1,2,3,4,5,6};//每行有3个元素
tow_array(buff,sizeof(buff)/sizeof(buff[0]));
}
/************遍历二维数组*****************
**
**以数组方式传入,必须指定列宽
**int line -- 二维数组行数
****************************************/
void tow_array(int buff[][3],int line)
{
int i,j;
for(i=0;i<line;i++)
{
for(j=0;j<3;j++)
{
printf("%d ",buff[i][j]);
}
printf("\n");
}
}

二维数组、数组指针以及指针数组_指针数组_02

  • 以数组指针传入
#include <stdio.h>
void tow_array(int (*buff)[3],int line);
int main()
{
int buff[][3]={1,2,3,4,5,6};//每行有3个元素
tow_array(buff,sizeof(buff)/sizeof(buff[0]));
}
/************遍历二维数组*****************
**
**以数组指针方式传入,必须指定列宽
**int line -- 二维数组行数
****************************************/
void tow_array(int (*buff)[3],int line)
{
int i,j;
for(i=0;i<line;i++)
{
for(j=0;j<3;j++)
{
printf("%d ",*(buff[i]+j));
}
printf("\n");
}
}

3.数组指针

    定义:int (*p)[n];  指向数组整体的指针。数组指针类型:int ()[n]

    ()优先级高,所以(*p)是一个指针,指向一个整型的一维数组,一维数组的成员个数为n,也就是说p的步长为n。即p+1偏移的地址为n个int型长度。因此数组指针也称为行指针。

    优先级: () > [] > *

示例:

#include <stdio.h>
int main()
{
int buff[][3]={1,10,3,4,5,6};//每行有3个元素
int (*p)[3]=buff;
printf("*p[0]=%d\n",*p[0]);//等价于buff[0][0]
printf("*(p[0]+1)=%d\n",*(p[0]+1));//等价于buff[0][1]
printf("*p[1]=%d\n",*p[1]);//等价于buff[1][0]
}

二维数组、数组指针以及指针数组_指针数组_03

4.指针数组

定义:int*p[n];  数组中保存int*指针。指针数组类型:int *[n],p的类型是int **,p+1偏移的地址为:sizeof(int )。

    []的优先级高,[]和p组合成一个数组,int和p[]组合成指针数组,他有n个指针类型的数组元素,即数组中的每一个元素都是int型指针。

    优先级: () > [] > *

  •     将二维数组赋给指针数组示例:
#include <stdio.h>
void tow_array(int (*buff)[3],int line);
int main()
{
int buff[][3]={1,10,3,4,5,6};//每行有3个元素
int *p[3];
*p=buff[0];
p[0]=buff[0];
p[1]=buff[1];
p[2]=buff[2];
printf("%d\n",(*p)[0]);//等价于:p[0][0]
printf("%d\n",(*p)[1]);//等价于p[0][1]
printf("%d\n",*(p[0]+1));//等价于p[0][1]
printf("%d\n",*(p+1)[0]);//等价于p[1][0],*(p+1)保存buf[1][0]地址
printf("%d\n",*(*(p+1)+1));//等价于p[1][1]
}

二维数组、数组指针以及指针数组_数组指针_04

注:二维数组赋值给指针数组时p=buff是错误的。

5. 二维数组通过二维指针方式传入

  • 示例一:
#include <stdio.h>
void tow_array(char **buff,int line);
int main()
{
int i;
char *buff[]={"123",
"123456",
"123456789",
"字符串口测试"
};
tow_array(buff,sizeof(buff)/sizeof(buff[0]));
}
/************遍历二维数组*****************
**
**以二维指针传入
**int line -- 二维数组行数
****************************************/
void tow_array(char **buff,int line)
{
int i,j;
for(i=0;i<line;i++)
{
printf("%s\n",*(buff+i));
}
}

二维数组、数组指针以及指针数组_数组指针_05

  • 示例二:
#include <stdio.h>
void tow_array(int **buff,int line,int row);
int main()
{
int i;
int buff[][3]={1,10,3,4,5,6};//每行有3个元素
int *p[3];
//将二维数组赋值给指针数组
for(i=0;i<sizeof(buff)/sizeof(buff[0]);i++)
{
*(p+i)=buff[i];//或p[i]=buff[i];
}
tow_array(p,sizeof(buff)/sizeof(buff[0]),3);
}
/************遍历二维数组*****************
**
**以二维指针传入
**int line -- 二维数组行数
**int row -- 二维数组列
****************************************/
void tow_array(int **buff,int line,int row)
{
int i,j;
for(i=0;i<line;i++)
{
for(j=0;j<row;j++)
{
printf("%d",*(*(buff+i)+j));//或者buff[i][j]
}
printf("\n");
}
}

二维数组、数组指针以及指针数组_数组指针_06

标签:int,二维,数组,printf,指针,buff
From: https://blog.51cto.com/u_15688123/5977364

相关文章

  • 【C++要笑着学】类和对象 | 初识封装 | 访问限定符 | 类的作用域和实例化 | 类对象模
       [本篇博客热榜最高排名:13 ]写在前面:本章将正式开始学习C++中的面向对象,本篇博客涵盖讲解访问限定符、封装的基础知识、类的作用域和实例化、探究类对象的存储和对......
  • 【维生素C语言】第四章 - 数组
     前言本章将对C语言的数组进行讲解,从一维数组开始讲起。已经学了三个章节了,所以本章还附加了三子棋和扫雷两个简单的小游戏,读者可以试着写一写,增加编程兴趣,提高模块化编程......
  • 【维生素C语言】第六章 - 指针
    前言:本章是指针部分的开始,将对C语言中非常重要的指针进行讲解。本章结束后有能力的读者可对应指针进阶部分进行进一步学习。指针专题配备了一些笔试题,建议尝试。一、指针的......
  • 【维生素C语言】第十章 - 指针的进阶(下)
    前言: ......
  • 【维生素C语言】画图解析C语言指针笔试题
    原标题:“祖安猎码人”在线手撕代码画图解析【C指针笔试题】前言:C语言指针笔试题,建议做完后再看答案。本篇博客有详细的解析部分,对每一道题进行深度的画图解析。如果你想复......
  • 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 targe
    1#include<stdio.h>2#include<stdlib.h>3#include<iostream>4usingnamespacestd;56int*twoSum(int*nums,intnumsSize,inttarget){//暴力遍......
  • C++ 四种智能指针详解
    智能指针出现的原因:主要解决的是堆内存分配释放,忘记释放内存引发的内存泄漏问题,智能指针最主要的事情就是让程序员无需去注意内存释放,内存释放的问题放在智能指针内部进行处......
  • LeetCode 删除排序数组中的重复项
    题目给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。由于在某些语言中不能......
  • 数组与链表
    数组数组定义数组是一种基础的线性数据结构,它是用连续的一段内存空间,来存储相同数据类型数据的集合。线性数据结构是有限的,它是某类元素的集合并且记录着元素之间的一组......
  • day04 IDEA&数组
    第一部分:IDEA开发工具参见:IEDA的安装请参考文件夹PPT中的04_IDEA.ppt1.数组1.1数组介绍​ 数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。1.2......