首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

其他|二维指针数组指针指针数组

c++的精华无疑是指针指针的灵活,创建和销毁完全靠我们掌控。用到指针,一般都会用到二维指针数组指针,下面总结下它们的某些应用场景。...2二维指针 二维指针指针变量指向的是指针,如: char **pa; 常用二维指针的场合是第一维和第二维元素个数都不确定的情况下,或者个数是动态变化的场合。 二维指针如何申请堆地址?...这样就申请了一个m行n列的二维动态数组。...与申请顺序相反: for(int i=0; i<m; i++){ delete[] pa[i]; } 最后释放pa: delete[] pa; 3数组指针 数组指针,是指向数组指针,如:...和二维指针相比,它有一个维度的个数必须是确定的,此处等于2,它创建如下: pa = new char[m][2]; 释放: delete [] pa; 4指针数组 指针数组数组,里面的元素是指针

1.2K51

二维数组指针_二维数组指针

二维数组指针⑴ 用指针表示二维数组元素。 要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。...而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组 下面我们讨论指针二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。...指针变量的值可以改变,即它可以随时指向不同的数组或同类型变量,而数组名自它定义时起就确定下来,不能通过赋值的方式使该数组名指向另外一个数组。 例4 求二维数组元素的最大值。...C语言可以通过定义行数组指针的方法,使得一个指针变量与二维数组名具有相同的性质。...行数组指针的定义方法如下: 数据类型 (*指针变量名)[二维数组列数]; 例如,对上述a数组,行数组指针定义如下: int (*p)[4]; 它表示,数组*p有4个int型元素,分别为(*p)[0]、(

1.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    指针二维数组

    先前已经写过二维数组的文章了,现在直接开始指针二维数组 int B[2][3]这个二维数组可以拆分成 创建了两个一维数组 B[0] B[1] 如果我这么写 int* p = B; 你肯定知道这是不行的...,因为我们讨论的是二维数组 这是一维数组的写法 是因为B相当于指向一维数组指针(这个一维数组有三个元素) int* p; &p = B; 经过两次解引用就可以得到二维数组的的首个元素 我们还需要再画一张图分析一下内存...说了那么多,就是要理解上图中的的伪代码 如果你已经理解了 那么你对二维数组指针已经理解的差不多了 说了那么多 正式进入二维数组指针应用 创建一个二维数组指针 and 遍历 int (*p)[3];可以这么理解这个指针指向了存放了三个整型数组的内存地址...(*p)[2][2]; 还是先画一个三维数组的内存图 跟二维数组指针是基本一样的 区别在于二维数组数组名解引用后是指向一维数组指针 三维数组数组名解引用后是指向二维数组指针 基于图片中的一些指针运算和解引用...我们也可以得出三维数组的遍历公式 C[i]=*(C+i) //返回指向二维数组指针 所以如果打印这个映射在内存图上 就表示第i个二维数组的首地址 如果i是0则是800 如果是1 则是816 *(C

    16610

    C二维数组指针

    为了更好的理解指针二维数组的关系,我们先来定义一个指向 a 的指针变量 p: int (*p)[4] = a; 括号中的*表明 p 是一个指针,它指向一个数组数组的类型为int [4],这正是 a...也就是说,p+1会使得指针指向二维数组的下一行,p-1会使得指针指向数组的上一行。 数组名 a 在表达式中也会被转换为和 p 等价的指针!...: 指针数组二维数组指针在定义时非常相似,只是括号的位置不同: int *(p1[5]); //指针数组,可以去掉括号直接写作 int *p1[5]; int (*p2)[5]; //二维数组指针...,不能去掉括号 指针数组二维数组指针有着本质上的区别:指针数组是一个数组,只是每个元素保存的都是指针,以上面的 p1 为例,在32位环境下它占用 4×5 = 20 个字节的内存。...二维数组指针是一个指针,它指向一个二维数组,以上面的 p2 为例,它占用 4 个字节的内存。 看完本文有收获?请转发分享更多人 因为分享是一种美德

    99920

    二维数组指针复习

    最近在练习C语言计算机二级的程序设计题,碰到了二维数组指针的结合,当时怎么调试都不对,自己也记不清楚该怎么用了就跑去看书翻资料重新复习。...本次复习看的讲解:点击访问 自己纠结的问题是二维数组 int a[3][4]的数组名是二级指针吗?...答案不是,而在上面的复习讲解上说是地址的地址是错的(但是他的讲解确实很让人懂二维数组的使用), a退化为指针后,类型为int (*)[4],该指针指向含4个int类型元素的一维数组。...&a+1和&a差值为48,正好是二维数组的长度(4(int长度)X3X4=48),+1是加了一个二维数组长度。...(摘自讲解中的话),因此我们只要找到令指针指向二维数组的首地址就能通过顺序来找到接下的元素。

    37610

    二级指针、一维数组指针二维数组指针

    使用指针访问数组元素和使用函数名没有任何区别,值得注意的是我们不同通过指针获得数组的大小,但是通过数组名却可以。...数组名和数组指针的区别 虽然说数组名可以当做指针使用,但实际上数组名并不等价于指针。...数组名代表的是整个数组,具有确定数量的元素 指针是一个标量,不能确定指向的是否是一个数组 数组可以在某些情况下会自动转换为指针,当数组名在表达式中使用时,编译器会把数组名转换为一个指针常量,是数组中的第一个元素的地址...,类型就是数组元素的地址类型(通过sizeof也可以看出来) 二维数组指针 二维数组可以理解为每一个元素都是一个一维数组数组,这样就可以很好的理解二维数组指针了。...下面定义了一个2行3列的二维数组,并画出了对应的内存模型。 我们可以使用arr[0]获得第0个一维数组,然后再加上一个小标就可以获取到对应的元素,如arr[0][0]获取了第0行第0列的元素。

    84820

    指针详解(二级指针指针数组数组指针、字符指针二维数组传参、函数指针变量)(二)

    二维数组可以被看作是数组数组,而指针数组数组指针。在该段代码中定义了三个一维数组,然后创建了一个指针数组,该数组指向这三个一维数组的开始地址。...然后你通过两个嵌套循环遍历这个“二维数组并打印其内容。 此模拟二维数组与真正二维数组的区别: 1、内存布局:真正的二维数组在内存中是连续的,而使用指针数组模拟的二维数组不是。...对于真正的二维数组,可以通过给出行和列的索引来直接访问元素。然而,对于使用指针数组模拟的二维数组,需要先找到对应的行,然后再找到对应的列,这需要额外的计算。...3、灵活性:使用指针数组模拟的二维数组可以更灵活地操作不同长度的行。例如,如果你想在运行时动态改变每行的长度,那么使用指针数组可能是更好的选择。...四、二维数组传参,形参写二维数组 1、为什么一维数组传参,形参可以是数组,也可以是指针?

    36910

    C语言指针引用二维数组

    最近看谭浩强的《C程序设计》,第248页 例8.11 看到这里例子感觉有点懵,所以根据这个例子自己总结了下: 一.不用取地址符和指针 1.二维数组的元素: a[0][1] 2.二维数组的地址:...2.1 0行首地址:a 2.2 1行0列元素地址:a[1] 2.3 1行首地址 : a+1 二.用取地址符(当然只能表示数组的地址) 1.0行首地址:&a[0] 2.元素地址:&a[0][1]...三.用指针(用指针无法指向某行的首地址) 1.元素值:* ((a+0)+1) 2.元素地址:(a+2)+0 写一个测试程序: #include int main() { int...a[3][4] = {1,2,3,4,5,6,7,8,9,12,13,0}; printf("----------------------\n"); printf("不用指针和取地址符\n");...d,%d,%d,%d\n",a[0][1],a,a[1],a+1); printf("用取地址符\n"); printf("%d,%d\n",&a[0][1],&a[1]); printf("用指针

    94030

    c++常量指针指针常量_指针指向二维数组

    ** 一:常量 ** 常量指针,指针常量,常量指针常量 a)常量定义:不可修改的值,例如250,’A’ b)const关键字功能:将变量常量化,四种形式 (1)const可以修饰普通变量,一旦修饰该变量...,该变量就当做常量看待,不可再更改 Const int a=250;//将变量a常量化 A=200;//gcc编译器报错 (2)常量指针:不能通过指针变量来修改指向的内存区域的数据,主要目的是保护数据不可篡改...例如 int a=250; Const int *pa=&a;//定义初始化一个常量指针 或者 int a=250; Int const *pa=&a; //定义初始化一个常量指针...;//gcc编译报错 (3)指针常量(不太用) 指针永远指向一块内存区域,不能再指向别的内存,但是可以修改指针内存的值 例如: int a=100; int * const pa=&a;//定义指针常量...1字节,2字节数据 //2、获取一字节数据 char *p1=(char *)&a;//将a的int型指针强制转化为char类型的指针 printf("a=%#x\n",*p1++);//0x78

    73220

    【C 语言】二级指针作为输入 ( 二维数组 | 二维数组遍历 | 二维数组排序 )

    文章目录 一、二维数组 1、二维数组声明及初始化 2、二维数组遍历 3、二维数组排序 二、完整代码示例 一、二维数组 ---- 前几篇博客中 , 介绍的是指针数组 ; 指针数组 的 结构特征 是 ,...数组中的每个元素 , 即每个指针变量 可以 指向不同大小的 内存块 ; 二维数组指针数组 的结构不同 , 二维数组 的 内存结构 是整齐的连续的 内存块 , 每个 一维指针 指向的内存块 的大小都是相同的...; // 使用指针访问 //printf("%s\n", *(array + i)); } 3、二维数组排序 二维数组排序 : 对二维数组进行排序 , 不能单纯的交换指针指向...二维数组排序 // 对 指针数组 进行排序 , 排序依据是 指针 指向的数据对比 for(i = 0; i < num; i++) { for(j = i +...二维数组排序 // 对 指针数组 进行排序 , 排序依据是 指针 指向的数据对比 for(i = 0; i < num; i++) { for(j = i +

    1.5K10

    指针二维数组的结合运用

    我们可以把二维数组的一行看成一个一维数组。 我们先声明一个二维数组和一个一维数组: a[3][2] b[2] , 方便下文说明! 有了这些区别,我们把他们和指针放到一起有什么区别那?...那类似的a也是一个指针常量,那么它指向的是谁那?事实上,二维数组名和一维数组名一样指向的也是他的第一个元素,但这里注意,二维数组的每个元素都是一个一维数组。...这个就是数组指针。这里就要引出数组指针了,数组指针的定义为: 数据类型(*指针名)[该二维数组中一维数组的元素的个数]。通过这样定义可以让指针指向二维数组。...同样的二维数组名也可以看成指针,即int(*p)[2] = a;那么可以把a看做是指针p,只不过a是指针常量,而p是指针变量。...2] = a;),通过这个我们就把指针二维数组联系到了一起。

    46640

    一维数组二维数组的取地址和指针

    arr跳过的是 4 字节 而 &arr 跳过的是 40 字节 二维数组 二维数组数组二维数组数组名 和 一维数组数组名有点差别,我们经常用一维数组的思维,想当然的认为二维数组数组名是整个数组的第一个元素的地址...二维数组就表示的是二维数组的地址。...引入一块代码进行测试: #define _CRT_SECURE_NO_WARNINGS #include //二维数组指针 int main() { int aa[2][5] =...该处地址信息由指针变量 ptr1 进行存储;再对ptr1 进行 -1操作,因为ptr 1的类型是int 类型指针,所以 -1 操作是跳过了 一个int 类型的字节,即为 数组最后一个元素 a[ 9 ]...我们需要用一个指针变量接受 *aa[ 0 ]的值, 因为 * aa[ 0 ]虽然表示的是第一行元素的地址,但是指针变量接收到的 还是 * aa[0] 第一个元素的地址。

    19210

    C语言进阶指南(11)(指针数组二维数组

    指针数组声明指针数组的标准形式如下type *name[];name是标识符,指针数组的声明是先让标识符与数组声明符([])结合,使这个声明是一个数组,然后在声明指针(*),声明这个数组是一个指针数组...2;//b=2*parr[2] = 3;//c=3*parr[3] = 4;//d=4*parr[4] = 5;//e=5指针数组二维数组数组指针这一章里我们了解到数组名和指针之间的关系。...当数组名作为指针使用时,指针的值是数组的首元素的地址。而二维数组的行下标指向的是一维数组的地址。...以arr2为例我们可以发现:指针数组可以充当二维数组的行下标因为他们都有着类似的作用,即指向一个数组的地址。...再对元素进行访问操作,就能得到二维数组中的元素。数组指针作为函数的参数可以将指针数组作为函数原型的参数来对二维数组进行操作。

    11110

    指针数组数组指针

    指针数组 :就是指针数组数组的元素是指针;  数组指针:就是指向数组指针。 简单举例说明:     int *p1[10];    声明了一个数组数组的元素是int型的指针。    ...int (*p2)[10]; 声明了一个指针, 指向了一个有十个int元素的数组。 这两种写法主要是因为运算符的优先级, 因为[]的优先级比*高。...第一种写法:p先和[]结合,所以是一个数组,后与*结合,是指针数组。 第二种写法:()的优先级比[]高,*号和p2构成一个指针的定义,指针变量名为p,int 修饰的是数组的内容,即数组的每个元素。...数组在这里并没有名字,是个匿名数组,           那现在我们清楚p 是一个指针,它指向一个包含10 个int 类型数据的数组,即数组指针 ?...int a[3]={1,2,3}; int (*p)[3]=&a;//指向3个int型数组元素的数组指针 int* p2[3]; //存贮3个int型变量地址 for(int i=0;i<3

    1.1K90

    【进阶指针一】字符数组&数组指针&指针数组

    3-2 初级使用(或者说给你看一下基本使用): 3-3这才是指针数组的正确使用方法!【指针数组模拟打印二维数组】  4....来看一个小测试题 4-4  来看一个脱裤子放屁的代码【看一看数组指针的使用】  4-5 这才是数组指针的正确使用方法捏【数组指针模拟打印二维数组】 5 测试题和规律总结 测验1: 测验2:那么指针数组指针...【指针数组模拟打印二维数组】  这和arr[3][5]的区别在于arr[3][5]在内存中中每一个元素的地址都是连续的,而指针数组模拟的二维数组这种方式的地址不是连续的。...【数组指针模拟打印二维数组指针数组虽然可以int(*p)[3]=&arr;其中arr是一个一维数组,但是这样太鸡肋了, 还不如直接int*p arr; 指针数组真正的使用场景是留给二维数组数组名时...其实数组指针还是可以指向一个二维数组: int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} }; int(*p)[3][5]=&arr;

    95940

    【C 语言】数组 ( 数组指针 | 数组指针定义 | 使用 数组指针类型 定义数组指针 )

    文章目录 总结 一、使用 数组指针类型 定义数组指针 二、完整代码示例 总结 // 首先 , 定义 数组指针类型 别名 typedef int(*ArrayPointer)[3];...// 然后 , 声明一个 数组指针类型 变量 ArrayPointer p = NULL; 一、使用 数组指针类型 定义数组指针 ---- 使用 数组指针类型 定义数组指针 , 首先 , 使用...typedef 定义一个数组指针类型 , typedef int(*ArrayPointer)[3]; 然后 , 定义一个普通数组 , 之后的 数组指针 指向该数组 , int array2...[3] = {0}; 最后 , 声明一个 数组指针类型 变量 , 将 array2 变量地址赋值给该 数组指针类型 变量 , 指针指向的数据类型为 int[3] 数组类型的变量 array2 ;..., 数组元素是指针 (作为参考) char *array = {"12", "ab", "34"}; // 数组指针 , 使用指针变量指向数组 // 使用 数组指针类型 定义数组指针

    3K10
    领券