数组指针的定义及初始化

zgjxwl 2008-05-04 09:18:49
某个二维数组定义: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个元素,不是它的整数倍,所以这样赋值很可能会出现问题

问下,数组指针的赋值约定是这样的吗
...全文
3276 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgjxwl 2008-05-05
  • 打赏
  • 举报
回复
先up下,大家先讨论,一会回来看,呵呵
SSSummering114 2008-05-05
  • 打赏
  • 举报
回复
建议把t该为[4][10],把t[i][8]和t[i][9]赋值为0,这样清楚点!
zgjxwl 2008-05-05
  • 打赏
  • 举报
回复
分给黄瓜兄了,大家没意见把,呵呵,只有他的回答帮助了我,结帖
guzhilei1986 2008-05-05
  • 打赏
  • 举报
回复
顶一下了,这帖子好烦。看的眼花缭乱。
zgjxwl 2008-05-05
  • 打赏
  • 举报
回复
再顶一次,没人讨论就结帖
jeff_nie 2008-05-05
  • 打赏
  • 举报
回复
看得我有点乱.
zgjxwl 2008-05-05
  • 打赏
  • 举报
回复
这个帖子再顶下,还有人讨论不
zgjxwl 2008-05-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 A_B_C_ABC 的回复:]
int (*q)[10];//这里q的类型是int(*)[10]; C++是强类型语言,强类型语言的好处是编译时可以尽量给你检查出潜在的错误. 楼主的理解是正确的. 如果你确定只用q引用t的前30个元素,是可以加强制转换的.//
[/Quote]
恩,黄瓜兄说的确实是这样,我理解的没错,怪不得我就没在书上找到类似的有关于数组指针的赋值的约定
原来没啥约定呀,只需要在赋值的时候在其之前加强制转换(int (*)[10])即可赋值,这样编译器也不会报错了

C++是一门强类型语言,它的类型转换并不是像一些弱类型语言一样那么随便,可以隐式转换,很多情况下需要给出显示的转换才可以
visame 2008-05-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 zgjxwl 的帖子:]
某个二维数组定义: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个元素的一维数组的指针
所…
[/Quote]
勤奋可嘉。改天有空再看。
0黄瓜0 2008-05-05
  • 打赏
  • 举报
回复
int (*q)[10];//这里q的类型是int(*)[10]; C++是强类型语言,强类型语言的好处是编译时可以尽量给你检查出潜在的错误. 楼主的理解是正确的. 如果你确定只用q引用t的前30个元素,是可以加强制转换的.//
herman~~ 2008-05-04
  • 打赏
  • 举报
回复
q = k; 可以过
q = t; 编译不能过

我想vs2005的编译器,应该做了数组赋值的维数检查
int k[5][10]; K指向第一行的首地址,该行有10列元素(这里做了维数检查)

int j[5]; j 指向当前行首地址
zgjxwl 2008-05-04
  • 打赏
  • 举报
回复
我想问的是数组指针赋值是如何约定的
是不是由于第二种会 出现问题,所以定义的时候,就定义了不能那样赋值
如果那样赋值,就会在编译的时候报错,我问的是关于数组指针的赋值是如何约定的
在哪本书上有详细介绍呢,我还没找一本,对这个讲的比较清楚的
iwantfat 2008-05-04
  • 打赏
  • 举报
回复
q = &(t[i]);
iwantfat 2008-05-04
  • 打赏
  • 举报
回复


#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;
}

Jncryang 2008-05-04
  • 打赏
  • 举报
回复
经测试int(*q)[10]和int a[5][10]能完全符合楼主的猜测,但是int (*q)[10]和int b[4][8]就不行了!
Jncryang 2008-05-04
  • 打赏
  • 举报
回复

#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;
}

q = t赋值时,编译出错!
zgjxwl 2008-05-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 effective_person 的回复:]
lz 写的太多了
难以阅读!
其实这些问题 你没有必要问!把自己想的在机器上实现就可以验证了!
[/Quote]
耐心点看完呀,呵呵
zgjxwl 2008-05-04
  • 打赏
  • 举报
回复
某个二维数组定义: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个元素,不是它的整数倍,所以这样赋值很可能会出现问题

问下,数组指针的赋值约定是这样的吗
Jncryang 2008-05-04
  • 打赏
  • 举报
回复
关注!感觉int(*q)[10]这种情况不多见
effective_person 2008-05-04
  • 打赏
  • 举报
回复
lz 写的太多了
难以阅读!
其实这些问题 你没有必要问!把自己想的在机器上实现就可以验证了!

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧