65,186
社区成员




#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int k[5][10];
int i = 0,j = 0;
for(i = 0;i < 5;i++)
for(j = 0;j < 10;j++)
{
k[i][j] = j + i*10;
}
int t[4][10];
for(i = 0;i < 4;i++)
{
for(j = 0;j < 8;j++)
{
t[i][j] = i * 8 + j;
}
int (*q)[10];
q = k;
cout << q << " " << k << endl;
cout << q + 1 << " " << k + 1 << endl;
q = &(t[0]); //出现问题
cout << q << " " << t << endl;
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int k[5][10];
int i = 0,j = 0;
for(i = 0;i < 5;i++)
for(j = 0;j < 10;j++)
{
k[i][j] = j + i*10;
}
int t[4][8];
for(i = 0;i < 4;i++)
for(j = 0;j < 8;j++)
{
t[i][j] = i * 8 + j;
}
int *p[10];
int (*q)[10];
q = k;
cout << q << " " << k << endl;
cout << q + 1 << " " << k + 1 << endl;
q = &(t[0][0]); //出现问题
cout << q << " " << t << endl;
return 0;
}
某个二维数组定义:int k[5][10];
int t[4][8];
指针数组定义:int *p[10];//定义一个指针数组,数组的每个元素都是指向int型对象的指针
数组指针的定义:int (*q)[10];//定义一个数组指针q,该指针指向的是一个包含有10个元素的一维数组
那么,如果我使用这条语句q=k;是合法的赋值.而使用q=t;也是合法的赋值把,我的理解是
首先,这两个二维数组,假设是按行优先顺序存储,那么使用q=k;因为q是指向包含有10个元素的一维数组的指针
所以,k总共有50个元素,分别截取,每10个看成是一个一维数组.刚好分为了5等份,q是指向由k[0][0]到k[0][9]所组成数组的指针
(q+1)则是指向由k[1][0]到k[1][9]所组成的一维数组的指针,后面的同理
而对于q=t;总共有32个元素,分为四组,q是指向由t[0][0]到t[1][1]所组成的一维数组的指针,同理,(q+3)是指向
由t[3][6]和t[3][7]以及它后面的未知的8个元素所组成的一维数组的指针(只不过这样经常会出问题而已,而且还有可能组不成一维数组等等)
请问,我上面的理解有错吗,是不是由于下面这个经常可能会出现问题,所以一般对数组指针赋值的时候
总是将某个数组的数组元素的总个数是数组指针所指向的(对象)数组的元素总个数的整数倍的数组赋给数组指针
例如:数组k有50个元素,恰好是数组指针q所指向的数组的元素个数10的整数倍,所以这样赋值一般不会出现问题
而对于后面的,t有32个元素,不是它的整数倍,所以这样赋值很可能会出现问题
问下,数组指针的赋值约定是这样的吗