鱼C论坛

 找回密码
 立即注册
查看: 1438|回复: 14

[已解决]指针数组问题

[复制链接]
发表于 2020-3-17 14:47:35 | 显示全部楼层 |阅读模式
1鱼币
int a[]={2,4,6,8,10,12,14,16,18,20,22,24},*q[4],k;
        for(k=0;k<4;k++) q[k]=&a[k*3];
        printf("%d\n",q[3][0]);

A 8
B 16
C 20
D 输出项不合法
答案C,请问q[3][0]什么意思,如何理解
最佳答案
2020-3-17 14:47:36
本帖最后由 sunrise085 于 2020-3-17 15:47 编辑

*q[4]是一个指针数组。
for循环是给*q[4]进行初始化。
循环结束后,指针q[0]指向a[0]即2,指针q[1]指向a[3]即8,指针q[2]指向a[6]即14,指针q[3]指向a[9]即20。
这里是把指针用数组的型式表示,q[3][0]就是a[9],q[3][1]就是a[10]
1.jpg
数组是顺序表示的。q[0][9]、q[1][6]、q[2][3]和q[3][0]都表示a[9]

最佳答案

查看完整内容

*q[4]是一个指针数组。 for循环是给*q[4]进行初始化。 循环结束后,指针q[0]指向a[0]即2,指针q[1]指向a[3]即8,指针q[2]指向a[6]即14,指针q[3]指向a[9]即20。 这里是把指针用数组的型式表示,q[3][0]就是a[9],q[3][1]就是a[10] 数组是顺序表示的。q[0][9]、q[1][6]、q[2][3]和q[3][0]都表示a[9]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 14:47:36 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-3-17 15:47 编辑

*q[4]是一个指针数组。
for循环是给*q[4]进行初始化。
循环结束后,指针q[0]指向a[0]即2,指针q[1]指向a[3]即8,指针q[2]指向a[6]即14,指针q[3]指向a[9]即20。
这里是把指针用数组的型式表示,q[3][0]就是a[9],q[3][1]就是a[10]
1.jpg
数组是顺序表示的。q[0][9]、q[1][6]、q[2][3]和q[3][0]都表示a[9]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 15:20:47 | 显示全部楼层
q是一个存有4个指针的指针数组
执行完for语句之后
q[0]指向a[0]
q[1]指向a[3]
q[2]指向a[6]
q[3]指向a[9]
通俗点说就是吧a[12]分为四个长度为3的一位数组,又分别用4个指针指向这4个一维数组
q[3][0]就是调用第4个一维数组的第一个元素的意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 15:22:45 | 显示全部楼层
我是这样理解的,执行完循环以后,k=3,q[3]=&a[9]; //是值为20的地址
a[i][j] = *(*(a+i)+j) q[3][0] = *(q[3]+0)=*(q[3]),所以等于20
不知道对不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-17 15:56:48 | 显示全部楼层
sunrise085 发表于 2020-3-17 15:28
*q[4]是一个指针数组。
for循环是给*q[4]进行初始化。
循环结束后,指针q[0]指向a[0]即2,指针q[1]指向a[ ...

可是q[4]是个一维指针数组,为什么可以用二维的来表示,还不出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 16:11:23 | 显示全部楼层
张世来4610484 发表于 2020-3-17 15:56
可是q[4]是个一维指针数组,为什么可以用二维的来表示,还不出错

你不要把它们想想的这么麻烦。不管什么一维二维。
单独看一个就可以了。举个例子,q[1]是一个指针,指向了a[3]。那么就可以用q[1]家下表的型式表示从a[3]开始的各个变量,q[1][0]表示a[3],q[1][1]表示a[4],q[1][2]表示a[5],以此类推。

所谓数组只是把一组数放在一起而已。一维数组,把每一个单独拿出来就是一个该类型的变量;二维数组,拆开之后就是多个一维数组,例如:int b[5][6];单独看b[3]不就是一个一维数组么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-17 20:53:15 | 显示全部楼层
sunrise085 发表于 2020-3-17 16:11
你不要把它们想想的这么麻烦。不管什么一维二维。
单独看一个就可以了。举个例子,q[1]是一个指针,指向 ...

但是照你这么想的话,没有给q定义二维数组,就用二维输出,题目给的a是一维数组,要是在最后
输出个a[0][0],就会报错,题目上这种用法我从来没在书上见过,但是试了一下又可以运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 21:33:19 | 显示全部楼层
张世来4610484 发表于 2020-3-17 20:53
但是照你这么想的话,没有给q定义二维数组,就用二维输出,题目给的a是一维数组,要是在最后
输出个a[0] ...

。。。。。。
一维数组的数组名有时候可以和指针换着用。若a是一维数组,那么a[0]就是确定的变量咯,怎么可能再有下标啊。
你所谓的题目上的这种写法,你是不是没有看到&符号啊
q[k]=&a[k*3],这是把int类型的变量a[k*3]的地址赋值给int类型的指针q[k],而不是把a[k*3]赋值给q[k],也就是说q[k]存放的是地址,这和把一个一维数组名赋给指针(q[0]=a)不是一样的吗?

算了不和你争辩了。你若还是不理解那就找你的老师去问问吧。我是不知道该怎么解释了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 21:44:01 | 显示全部楼层
本帖最后由 4goodworld 于 2020-3-18 21:14 编辑
int main() {

        int a[] = { 2,4,6,8,10,12,14,16,18,20,22,24 };
        int*  q[4];
        int k;
        for (k = 0; k < 4; k++) { 
                q[k] = &a[k * 3] ;
        }
        /*
                k=0
                q[0]={2,4,6……,24}
                k=1
                q[1]={8,10,12……,24}
                k=2
                q[2]={14,16,18……,24}
                k=3
                q[3]={20,22,24}
        */
        printf("%d\n", q[3][0]);


        return 0;
}
这个我感觉最关键的是理解
指针=数组取地址
所以q[4]是一个指针数组(数组元素全为指针变量的数组称为指针数组)
而a很明确就是一个int类型数组,请不要混淆
q什么样子与a没有半毛钱关系

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-18 11:34:16 | 显示全部楼层
sunrise085 发表于 2020-3-17 21:33
。。。。。。
一维数组的数组名有时候可以和指针换着用。若a是一维数组,那么a[0]就是确定的变量咯,怎 ...

我还是不能理解q为什么可以这么写,,,我太难了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 15:15:54 | 显示全部楼层
张世来4610484 发表于 2020-3-18 11:34
我还是不能理解q为什么可以这么写,,,我太难了

去学汇编语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 16:23:09 | 显示全部楼层
https://zhidao.baidu.com/question/1304089356848302819.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 16:29:26 | 显示全部楼层
张世来4610484 发表于 2020-3-17 15:56
可是q[4]是个一维指针数组,为什么可以用二维的来表示,还不出错

因为在你定义一个数组的时候,例如;
int a[] = {1, 2, 3, 4, 8};
int* p = a; 
数组名a的值是数组的首地址,也就是a[0]的地址。而指针变量的值也是地址。只要它们两个的类型是一样的,比如都是int型。同时p[0]等同于a[0];p[1]等同于a[1]
在程序执行的过程中,其实就是通过首地址a,自增i,来找到数组下标i所在内存单元,并取出值的,跟指针没有什么本质区别。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 20:27:39 | 显示全部楼层
4goodworld 发表于 2020-3-17 21:44
这个我感觉最关键的是理解
指针=数组取地址
所以q[4]是一个指针数组(数组元素全为指针变量的数组称为 ...

不是你代码注释上面写的东西,指针变量的值就是一个地址,q[0]仅仅是告诉了你首地址,但是并没有告诉你它的长度,也就意味着q[0]并不是等于{2, 4, 6},输出q[0][5],甚至q[1][-1]一点问题都没有。这也是为什么在使用数组或者是指针变量指向数组的时候,要注意检查是否越界的原因。一般编译器并不会帮你检查
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 21:14:12 | 显示全部楼层
村上猫 发表于 2020-3-18 20:27
不是你代码注释上面写的东西,指针变量的值就是一个地址,q[0]仅仅是告诉了你首地址,但是并没有告诉你它 ...

你说得有道理,确实应该改下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 20:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表