(*p)[2]二维数组?

供稿:hz-xin.com     日期:2025-01-16
C语言二维数组指针变量是什么,int (*p)[2]什么意思

int (*p)[4]
定义了一个指针p,指向一个4个元素的数组。只是定义一个指针,
指向4个元素的数组

int *p[4]
定义了一个数组指针p[4],p的每个元素指向一个整型的数据。就
是数组里面保存的是指针
(1)int* p[2] 是一个指向int型的指针数组,即:p是包含两个元素的指针数组,指针指向的是int型。

可以这样来用:

#include

void main() {

int* p[2];
int a[3] = {1, 2, 3};
int b[4] = {4, 5, 6, 7};
p[0] = a;
p[1] = b;
for(int i = 0; i < 3; i++) cout << *p[0] + i;// cout << **p + i;
cout << endl;
for(i = 0; i < 4; i++) cout << *p[1] + i;// cout << **p + i;

}

(2)对于 int (*p)[2], 它相当于一个二维数组的用法,只是它是一个n行2列的数组,可以这样来用:

#include

void main() {

int (*p)[2];
int b[3][2] = {{1, 2}, {3, 4}, {5, 6}};
p = b;
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 2; j++) //cout << p[i][j]; //cout << *(*(p+i)+j);
cout << endl;
}
}

int a[SIZE][SIZE];

int **p = a;
这样是不行的
但是可以这样:
int**p = (int**)malloc(sizeof(int*)*SIZE);
for (int i = 0; i < SIZE; i++) {
p[i] = (int*)malloc(sizeof(int)*SIZE);
}
然后就可以这么用了 p[i][j]。
想要指向二维数组,必须定义一个指向一维数组的指针
int (*p)[SIZE] = a; 这样才能赋值。

通过定义,可以知道:p是一个指针,这个指针指向的是3个一组整数的数据区,当p=a的赋值完成后,p指向a数组的第1组数据即a[0][0],a[0][1],a[0][2],则(*p)[0]就是p[0][0]就是a[0][0],那么(*p)[2]就是p[0][2]就是a[0][2];

如果写(*(p+1))[2]则是p[1][2]也是a[1][2]



这题有意思,
首先 int a [] [3] = {1,2,3,4,5,6}; 是一个二维数组,但是内存空间中这些数据的存储是连续的。可以理解为 int a [5] = {1,2,3,4,5,6}; a存储的都是数组的首元素地址,区别在于以为一维数组的下标代表的是地址,二维数组下标代表的是行和列的个数。
int (*p)[3]; 这里是用指针的形式 声明一个新的数组,
p = a; 这里把a数组的首元素地址赋给 指针数组,此时新声明的指针数组就指向了a数组,*p就等于a[0];
所以 (*p)[2]等价于a[2] = 3;一维数组下标为二的元素

C语言中,访问数据时,"[]"操作符实际上就是读取偏移地址内数据的操作符,比如a[b]就是读取从内存a开始往后b个单位的内存的数据,也就是*(a+b),所以*(a+b)和a[b]就是一回事,是等价的。 现在看(*p)[2], *p就是*(p+0),也就是p[0],那(*p)[2]自然就是p[0][2]了,p[0][2]就是3.

[]和*都有降维作用。如果p是二维指针(或数组),则p[x]或*p降为一维,p[][]或**p降为指向元素。
所以题目中的(*p)降为一维数组后,再[2]就是从一维数组中取第2个元素3了。
最重要的是你得弄清楚p指向哪一个一维数组,以及做类似p+1或p[1]运算时,这个1的跨度有多大(是跨一行还是跨一个元素?),这由当前“p所在的表达式”是几维来决定的

首先a[][3]={1,2,3,4,5,6}表示将1到6这六个数字按三个数进行分组,即每三个数字为一行形成一个二维数组:第0行是1,2,3;第1行是4,5,6.
因为p=a,则(*p)[2]相当于(*a)[2];
又因为a作为二维数组的首地址(也就是a[0][0]的地址),则*(a+i)表示第一个维度(即第i行)的首地址(即*(a+0)为第0行首地址a[0];*(a+1)为第1行首地址a[1];依此类推)。然后,(*(a+i))[j]即可表示第i行第j列元素的值。
综上所述,(*p)[2]=(*a)[2]=(*(a+0))[2]也就是第0行第2列的值,即3.

int a[3][2] = { 1,2,3,4,5,6 }, (*p)[2]; p = a; printf("%d\\n",a...
二维数组的首地址是二级指针,二级指针就是指针的指针,意思就是一个指针指向了另一个指针。假如:int **b , *a; b = &a; 所以*b中存放的是指针a指向的地址值, b就是a的地址值。所以这里的**a 和*a就是这个道理。这里*a就是第一行首地址的地址值 ...

为什么二维数组(a[][3])[3]=3
因为p=a,则(*p)[2]相当于(*a)[2];又因为a作为二维数组的首地址(也就是a[0][0]的地址),则*(a+i)表示第一个维度(即第i行)的首地址(即*(a+0)为第0行首地址a[0];*(a+1)为第1行首地址a[1];依此类推)。然后,(*(a+i))[j]即可表示第i行第j列元素的值。综上所述...

C语言中二维数组的指针问题
&a[0][0] 也是指0行0列的元素地址 p=&a[0][0] 它的意思的使指针p指向数组a的第0行第0列,而在后面执行p++的时候,就会使指针顺序后移,依次指向 a[0][1] a[0][2]……a[2][2] 的地址;假如:p=a 这是使指针p指向数组a的首行,当你输出*p这个值的时候,它输出的值是a[0...

C语言中的二维数组名是一个二重指针吗?
不是 二级指针p也可以解释为指针的指针,即p内保存的值实际上还是一个指针,计算:p的值实际上是一个指针值,那么 *(*p)即二级指针指向的最终值 对于二维数组a[2][2],a也是一个地址,并且这个值也等于a[0],也等于a[0[0]的地址,即&a[0][0],由此看来对a取地址的值是一个变量值(不...

C语言(*p)[ ]是什么意思
二维数组是由几个一维数组组成的。比如:设有一个数组a[3][4],a是一个数组名。a数组包含4个元素(4个列元素)假如,a[0]所代表的一维数组又包含4个元素;a[0][0],a[0][1],a[0][2],a[0][3] 可以认为二位数组是数组的数组,即数组a是由三个一维数组所组成的 可见我的附图 因此...

如何用c语言实现二维数组?
使用 C 语言实现二维数组可以通过以下步骤:1. 声明一个二维数组变量:首先,需要声明一个二维数组变量来存储数据。声明二维数组需要指定数组的行数和列数,并可以给数组命名。2. 初始化二维数组:可以选择在声明二维数组时初始化,或者在后续的代码中初始化数组。可以使用循环结构来遍历数组的每个元素,并...

二维数组:int arr[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};_百...
二维数组的指针机制:就是按照一维分布的。如:int arr[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};int* p = arr[0];就是说*p从1开始,*p[1]就是a[0][1],*p[2]就是a[0][2],等等,知道*p[11]就是a[3][2]你说的那四个值一样,那是肯定的,都是计算机为这个...

C语言 申请动态2维数组
使用的时候就和一般的二维数组一样。举个例子给你:include "stdlib.h"include "stdio.h"include <malloc.h> int main(){ int i,j;int (*p)[10];\/\/动态生成二维数组格式就是相当与p[10][10],如果想改,自己该里面 的参数,如果想定义n行2列就为: p=(int (*)[2])malloc(n*2*sizeof...

int* p[];?
2.C int (*p)[m]定义的数组指针,表示定义一个指针变量,此指针变量是指向一个含有M个元素的一维数组:举例:int a[]={1,2,3,4,5},(*p)[5];p=a;那么指针p就指向数组a的首地址,*(p+i)表示数组a中的值。一个更常用的用法是:用二维数组的行地址给其赋值:int a[3][2]={1,2,...

...*号什么时候是指针,什么时候是取值啊!二位数组中元素引用被弄混了...
int a;int *p=&a;\/\/*p是取值,p只a的地址,&p是指针的地址;二维数组;int a[2][2];int **p=a;p指向a地址,*p表示a[0][0];p则是a[0][0]的值 (*p+1)则是a[0][1]d的值 \/\/\/ p就相当于数组名,1就是元素位置所占的内存字节。懂了没?