C中指针如何指向二维数组?

作者&投稿:禤婕 (若有异议请与网页底部的电邮联系)
我觉得应该是有问题的,二维数组的数组名可以相当于指针的地址,a[0]才是这个维数组的地址,而a相当于存放了两个元素的一维数组,但这两个元素是a[0]和a[1],所以这两个元素是地址,所以a是地址的地址
希望你能够明白,你能明白比你积分更珍贵,加油!

你这个方式没有任何问题啊,只是编译器有一处告警


int* p = a;


warning C4047: 'initializing' : 'int *' differs in levels of indirection from 'int (*)[2]'



下面是测试代码:

#include <stdio.h>

int main()
{

int a[2][2] = {
  {1,2},
  {3,4}
 };
 
int* p = (int*) a;  

int i;

for(i=0;i<4;++i)
printf("%d ",*p++);
printf("
");
}


#include <stdio.h>

int main()
{
int a[2][2] = {{1,2},{3,4}};
int (* p)[2] = a;
int i,j;
for(i = 0; i < 2; i++)
{
for(j = 0; j < 2; j++)
{
printf("%d\n",p[i][j]);
}
}
return 0;
}
注:VS2012编译通过

一般二维数组有三种形式:
1、int **p;
2、int *p[ 2 ];
3、int ( *p )[ 2]
按照楼主的代码应该选第3种,不懂可以追问我

指向二维数组的指针~

int(*p)[10]定义了一个指向二维数组的指针p,赋给它10个长度,把a数组的值赋给(*p)[10]。
注意,这里是a数组是5行10列的,放入(*p)[10]是把a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5],a[0][6],a[0][7],a[0][8],a[0][9]放入(*p)[0]中,同理,将a[1][0...9]放入(*p)[1]。
最后(*p)[10]中的值只有五行被初始化为a数组的值了。
在本例中,p和p[0]是同一个意思,就是数组a的起始地址,等价于cout<<a<<endl,但是他们有区别,p指向的是整个数组的首地址,而p[0]则指向a的首行首地址(继续往下看...)。
p[9]则值内存为p数组分配的(*p)[9]的地址。如果你仔细验证程序的输出结果,就会发现:
#include
#include "iostream"
using std::cout;
using std::endl;
using std::hex;
void main()
{
int a[5][10]={1,2};
int (*p)[10]=a;
cout<<p<<endl;
cout<<p[0]<<endl;
cout<<p[9]<<endl;
}
输出结果为(不同机器结果不同):
0012FEB8
0012FEB8
00130020
如果验证它们这些地址存储的值会发现:
#include
#include "iostream"
using std::cout;
using std::endl;
using std::hex;
void main()
{
int a[5][10]={1,2};
int (*p)[10]=a;
cout<<*p<<endl;
cout<<(*p)[0]<<endl;
cout<<(*p)[9]<<endl;
}
输出结果为:
0012FEB8
1
0
这是p和p[0]的区别就体现出来了。因为*p并不是取首元素的值,它这时才相当于p[0]。那如何通过p取得首元素的值呢,很显然,应该再加一个*操作符,如下:
cout<<**p<<endl;
这时输出结果自然就会和(*p)[0]一样是1了。

扩展资料
设p是指向二维数组a[m][n]的指针变量,则有:
int* p=a[0];//此时P是指向一维数组的指针。P++后,p指向 a[0][1]。
如果定义int (*p1)[n];p1=a;p1++后,p1指向a[1][0];
则p+j将指向a[0]数组中的元素a[0][j]。
由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如下:
p+i*N+j
相应的如果用p1来表示,则为*(p1+i)+j
元素a[i][j]相应的指针表示为:
*( p+i*N+j)
相应的如果用p1来表示,则为*(*(p1+i)+j)
同样,a[i][j]也可使用指针下标法表示,如下:
p[i*N+j]
例如:
int a[3][4]={{10,20,30,40,},{50,60,70,80},{90,91,92,93}};
则数组a有3个元素,分别为a[0]、a[1]、a[2]。而每个元素都是一个一维数组,各包含4个元素,如a[1]的4个元素是a[1][0]、a[1][1]、a[1]2]、a[1][3]。
若有:
int *p=a[0];
则数组a的元素a[1][2]对应的指针为:p+1*4+2
元素a[1][2]也就可以表示为:*( p+1*4+2)
用下标表示法,a[1][2]表示为:p[1*4+2]
参考资料:百度百科 二维数组

你是想让这个指针直接指向你静态定义的数组还是指让指针开辟一块新空间让它等于静态数组,这是很不同的。
照楼上说的方法你自然可以很方便得到静态数组的指针。但是注意如果你的这个赋值是要在其他地方使用,即不是在
[2][15] ={
{0, 0, 0, 1, 2, 3, 2, 1, -1},
{4, 5, 6, -1}
所在的函数内部使用的话(而且用到指针的大都这种状况)
那么你必须new出一片新空间来,再用原来的静态定义给新空间赋值。
这样保证你所得到的地址是有效的,这些数字还在。

如果你直接在外部使用静态定义的数组的话,地址自然能找到,但是里面其实已经被析构掉了,内容天差地别,你对其操作还会引起非法。

诸多麻烦。。

怎么用指针的指针 指向二维数组的每个元素
答:比如整型二维数组, 先定义int **p 然后 根据行数,申请和行数相同的int *指针 每个指针指向二维数组对应行。这样就可以通过每行的首地址,访问该行所有元素了。

怎么用指针指向二维数组,又怎么利用指针引用二维数组中的元素
答:如果只是指向首行首列(第0行0列)的元素,直接用数组名赋值给指针变量即可(与一维数组相同,数组名就是首地址)二维数组是以行为单位的,每一行都是一个一维数组,因此,存放顺序是:第0行0列-第0行最后列-第1行0列-第1行最后列-第2行0列 这样类推,在指针运算的时候,按这个规律做推算。在行做运...

C语言怎么定义一个字符指针指向一个二维字符数组的首地址
答:二维数组也是“数组的数组”所以定义一个指向由m个元素组成的一维数组指针即可指向二维数组的首元素地址。如:char arr[2][2] = { { 'a', 'b' }, { 'c', 'd' } };char (*p)[2];p=arr; // p指向首元素地址。char c = *(p[0]+ 1);// 指向0行1列 即字符b ...

C语言如何定义指针指向字符型二维数组
答:1.使用列指针:定义一个列指针p,让它指向二维数组的第0个元素 int a[3][4];int *p;p=&a[0][0];//因为a[0]是第0行的数组名,所以p=&a[0][0]相当于p=a[0],因为a[i][j]前面共有i*4+j个元素 该二维数组的任意i行j列元素可表示为*(p+i*4+j)。2.使用行指针:定义一个...

指向字符型二维数组的指针该怎么写?
答:在C语言中,可以通过如下方式来定义指向字符型二维数组的指针:char c[4][5]; // 定义一个4行5列的字符型二维数组char (*pc)[5]; // 定义一个含5个元素的数组指针pc=c; // 将数组指针pc指向二维字符数组c 注:char (*pc)[5] 不能写为 char *pc[5]char (*pc)[5] 表示数组...

怎样使用指针引用二维数组的元素
答:对于a[i][j](二维数组的大小为n×m)而言,首先要搞清楚行指针和列指针 行指针:&a[i]或者a+i指向行,&a[i]=&*(a+i)=a+i 列指针:a[i]或*(a+i)指向列,a[i]等价于*(a+i)元素的引用方式有如下三种方式 1.通过地址引用二维元素 (&a[i][j]),(a[i]+j),(*(a+i)+j),...

用指针引用二维数组元素
答:a 是数组首地址,等于 &a[0][0].p 声明里是指针。语句里 *p 是 指针指向的值。 语句里 p 是地址.p 是1个星号的指针,可以让它指向1维数组,也可以让有序地它指向2维数的各元素。int a[行][列]; a[j][i] 数组元素排列 是:第一行 的 第1列,第二列,第三列...第二行 ...

C语言指针指向一维数组与二维数组?
答:3和2是一样的,也是会报错的。可以使用行指针double (*p)[3]=data;指向数组第0行,也就是我们平常理解的第一行。访问方式,假设data是i行j列,*(*(p+i)+j)就是第i行j列的元素值,也就是data[i][j]的值。也可以使用列指针double *p = data[0]指向第0行0列,访问方式如下:...

c++指针数组怎么用,还有指针数组和数组指针
答:指针的数组和整型的数组是指一个数组,其中每一个元素是指针类型;数组的指针是指一个数组的首元素的地;参考实例应用如下://注意指针数组和数组指针分别是如何指向二维数组的;include <stdio.h> main(){ static int m[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};/* 定义二维数组m并初始化...

c语言中,关于指针int(*p)[4]和int*p指向二维数组a[3][4]初始化的问题...
答:p指向一个N列二维数组的首地址 p自增1,p指向下一“行”一维数组的首地址 因为p是一个二级指针。所以索引其指向的数据内容需要取二次内容,格式及解释如下:格式:*(*(p+行)+列)解释:其实很好理解,因为p作为二级指针,p++代表的仅仅是行号+1所以格式中*(p+行)就取到了所在行首地址指针(...