二维数组和指向指针的指针

留下我美梦 留下我美梦     2022-08-26     793

关键词:

一道面试题引发的问题,首先要知道[]的优先级高于*,题目:

char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么?

直接用程序说明:

技术分享
#include<stdio.h>

void main()
{
char **p,a[6][8];
p = a;
printf(" ");
}
技术分享

编译,然后就会发现通不过,报错:错误 1 error C2440: “=”: 无法从“char [6][8]”转换为“char **” 

于是乎,我看了下《C专家编程》里10.5节—使用指针向函数传递一个多维数组。

方法一,函数是 void fun(int arr[2][3]); 这种方法只能处理2行3列的int型数组。

方法二,可以省略第一维的长度。函数是 void fun(int arr[][3]);这种方式虽然限制宽松了一些,但是还是只能处理每行是3个整数长度的数组。

    或者写成这种形式 void fun(int (*arr)[3]);这是一个数组指针或者叫行指针,arr和*先结合使得arr成为一个指针,这个指针指向具有3个

    int类型数据的数组。

方法三,创建一个一维数组,数组中的元素是指向其他东西的指针,也即二级指针。函数是 int fun(int **arr);这种方法可以动态处理各行各列不一样长度的数据。

注意:只有把二维数组改成一个指向向量的指针数组的前提下才可以这么做!比如下面的程序可以正常输出abc:

技术分享
#include <iostream> 
using namespace std;
void test(char **ptr)
{
cout << *ptr << endl;
}

int main()
{
char *p[3] = {"abc", "def", "ghi"};
test(p);
return 0;
}
技术分享

在《C专家编程》10.3节的小启发里讲的很透彻:(以下这段文字及对比一定要认真分析!)

数组和指针参数是如何被编译器修改的?

数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写成“数组的指针”,而不是“指针的指针”:

实参                                                      所匹配的形参

数组的数组          char c[8][10];                 char (*)[10];          数组指针

指针数组             char *c[10];                   char **c;               指针的指针

数组指针(行指针)  char (*c)[10];                 char (*c)[10];        不改变

指针的指针           char **c;                       char **c;               不改变

下面再看一个网友的一段分析相当给力的代码:

技术分享
#include "stdafx.h" 
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
int arr1[3];
int arr2[3];
int arr3[3];
int * ptr;
// ptr1是一个指向 int [3] 的指针,即ptr的类型和&arr1的类型是一样的,注意:arr1指向的内存区域定长
int ptr1[3][3]={{1,2,3},{1,2,3},{1,2,3}};
// ptr2是一个指向 int * 的指针,即ptr2的类型和&ptr是一样的,注意:ptr指向的内存区域不定长
int * ptr2[3]={arr1,arr2,arr3};
// ptr3是一个指向 int [3] 的指针,即ptr3的类型和&arr1的类型是一样的,注意:arr1指向的内存区域定长
int(* ptr3)[3]=&arr1;
ptr3=ptr1; // 没错,他们的类型相同
// ptr3=ptr2;//error 无法从“int *[3]”转换为“int (*)[3]
// ptr4是一个指向 int * 的指针,即ptr4的类型和&ptr是一样的,注意:ptr指向的内存区域不定长
int ** ptr4;
//ptr4=&arr1; //error 无法从“int (*)[3]”转换为“int **
ptr4=ptr2; // 没错,他们的类型相同
//ptr4=ptr3; // error 无法从“int (*)[3]”转换为“int **
return 0;
}











































二维数组名和二级指针

1.指针1.1一个指针包含两方面:a)地址值;b)所指向的数据类型。1.2解引用操作符(dereferenceoperator)会根据指针当前的地址值,以及所指向的数据类型,访问一块连续的内存空间(大小由指针所指向的数据类型决定),将这块空... 查看详情

指向数组的指针(二维指针)

char (*a)[N];//指向数组的指针    a = (char (*)[N])malloc(sizeof(char) *N* m);  printf("%d", sizeof(a));//4,指针  printf("%d",  查看详情

创建指向二维数组的指针

】创建指向二维数组的指针【英文标题】:Createapointertotwo-dimensionalarray【发布时间】:2009-06-2713:20:43【问题描述】:我需要一个指向静态二维数组的指针。这是怎么做到的?staticuint8_tl_matrix[10][20];voidtest()uint8_t**matrix_ptr=l_matrix;//w... 查看详情

指针和二维数组

 array这里指向的是第一行的五个元素 可以证明:    我画了一个图 二维数组指针的结论:①所谓的多维数组其实就是一维数组线性扩展得到的  一道题目:  查看详情

二维数组和数组指针的关系

  昨天既然写了一些关于数组指针的话题,那么今天就写一些关于数组指针的话题吧!  数组指针:这样读数组的指针,即指向数组的指针,就是数组指针,其本质就是一个指针  比如:int(*a)[3];就是一个数组指针,运用... 查看详情

二维数组和二级指针关系浅析

...一个数组可以这样定义chara[3];分配了3个字节的内存  二维数组可以这样定义charb[3][3];分配了3* 查看详情

指向二维数组元素的指针变量

  (1)指向数组元素的指针变量  例1.有一个3X4的二维数组,要求用指向元素的指针变量输出二维数组各元素的值.  编写程序1#include<stdio.h>2intmain()3{4inta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};5int*p;6for(p=a[0];p<a[0]+12;p++)//a[0]代表... 查看详情

指向二维数组的指针

】指向二维数组的指针【英文标题】:Apointerto2darray【发布时间】:2012-01-2621:31:24【问题描述】:我有一个关于的问题。如果一个数组类似于inta[2][3];那么,这是指向数组a的指针吗?int(*p)[3]=a;如果这是正确的,我想知道[3]与int(*p... 查看详情

指向二维数组的指针的类型是啥?

】指向二维数组的指针的类型是啥?【英文标题】:Whatisthetypeofapointertoa2Darray?指向二维数组的指针的类型是什么?【发布时间】:2018-01-0615:54:27【问题描述】:我知道以下不正确:intarr[2][3]=;//somearrayinitializationhereint**ptr;ptr=arr;... 查看详情

如何使用 C++ 中的指针动态分配和解除分配二维数组?

】如何使用C++中的指针动态分配和解除分配二维数组?【英文标题】:Howtodynamicallyallocateanddeallocatea2Darrayusingpointersinc++?【发布时间】:2020-10-1413:32:53【问题描述】:我想使用指针动态分配然后解除分配二维数组。我的想法是创... 查看详情

存储指向二维数组的指针[重复]

】存储指向二维数组的指针[重复]【英文标题】:Storepointerto2darray[duplicate]【发布时间】:2014-08-2523:23:00【问题描述】:所以我在班级Map中有一个私人成员:char**_map;然后我尝试将指针数组初始化为二维char数组,如下所示:std::vec... 查看详情

行指针指向二维数组

指向多维数组的问题要注意一下:指针的使用灵活多变,一定要记好指向一位数组的指针它的形式是如何的:float(*pointer)[5] 一定要记好它是有小括号的,float*pointer[5]是错误的,不要犯此错误,当定义了二位数组floatstudent[10][... 查看详情

c语言二维数组指针变量是啥,int(*p)[2]啥意思

二维数组指针变量形式如下:类型名(*数组名)[数组行数][数组列数]如:int(*p)[2][3];//定义一个int类型的二维数组指针变量,数组中每个元素都是一个指针int(*p)[2]表示定义一个数组指针,只是是一个一维的数组指针,数组中每个元... 查看详情

如何在 C++ 中初始化指向动态二维数组的指针 [关闭]

】如何在C++中初始化指向动态二维数组的指针[关闭]【英文标题】:Howtoinitializeapointertoadynamic2DArrayinC++[closed]【发布时间】:2016-08-2113:55:06【问题描述】:我正在给一个冒险者类,其中包含一堆函数和成员变量。其中之一是:strin... 查看详情

多维数组与指针(代码片段)

...多维数组的指针比一维数组的指针要复杂一些。可以认为二维数组是数组的数组。例:定义:inta[3][4]=1,2,3,4,5,6,7,8,9,10,11,12;则二维数组a是由3个一维数组所组成的,设二维数组的首行首地址为2000,表示形式含义... 查看详情

第二次作业

...型。指针指向数组或字符串时指向的是数组首地址。指向二维数组时,指针指向的是二维数组中的第一个元素,也是一个数组。数组名与指针可以通用。指针可以自加或自减,数组名是指针常量,不能自加或自减。指针指向一个... 查看详情

数组指针和指针数组的区别

...也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:inta[3][4];int(*p)[4];//该语句是定义一个数组指针,指向含4个元素的一维数组。p=a;//将该二维数组的首地址赋给p,也就是a[0]或&a 查看详情

c语言二级指针内存模型(指针数组|二维数组|自定义二级指针|将一二模型数据拷贝到三模型中并排序)(代码片段)

文章目录一、指针数组和二维数组数据拷贝到自定义二级指针中1、函数形参设计规则2、三种内存模型对应函数形参指针退化规则二、完整代码示例一、指针数组和二维数组数据拷贝到自定义二级指针中将指针数组和二维数组中... 查看详情