张世来4610484 发表于 2020-3-17 14:47:35

指针数组问题

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

A 8
B 16
C 20
D 输出项不合法
答案C,请问q什么意思,如何理解

sunrise085 发表于 2020-3-17 14:47:36

本帖最后由 sunrise085 于 2020-3-17 15:47 编辑

*q是一个指针数组。
for循环是给*q进行初始化。
循环结束后,指针q指向a即2,指针q指向a即8,指针q指向a即14,指针q指向a即20。
这里是把指针用数组的型式表示,q就是a,q就是a

数组是顺序表示的。q、q、q和q都表示a

就是要努力呀 发表于 2020-3-17 15:20:47

q是一个存有4个指针的指针数组
执行完for语句之后
q指向a
q指向a
q指向a
q指向a
通俗点说就是吧a分为四个长度为3的一位数组,又分别用4个指针指向这4个一维数组
q就是调用第4个一维数组的第一个元素的意思

最后的魁拔 发表于 2020-3-17 15:22:45

我是这样理解的,执行完循环以后,k=3,q=&a; //是值为20的地址
a = *(*(a+i)+j) q = *(q+0)=*(q),所以等于20
不知道对不对

张世来4610484 发表于 2020-3-17 15:56:48

sunrise085 发表于 2020-3-17 15:28
*q是一个指针数组。
for循环是给*q进行初始化。
循环结束后,指针q指向a即2,指针q指向a[ ...

可是q是个一维指针数组,为什么可以用二维的来表示,还不出错

sunrise085 发表于 2020-3-17 16:11:23

张世来4610484 发表于 2020-3-17 15:56
可是q是个一维指针数组,为什么可以用二维的来表示,还不出错

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

所谓数组只是把一组数放在一起而已。一维数组,把每一个单独拿出来就是一个该类型的变量;二维数组,拆开之后就是多个一维数组,例如:int b;单独看b不就是一个一维数组么?

张世来4610484 发表于 2020-3-17 20:53:15

sunrise085 发表于 2020-3-17 16:11
你不要把它们想想的这么麻烦。不管什么一维二维。
单独看一个就可以了。举个例子,q是一个指针,指向 ...

但是照你这么想的话,没有给q定义二维数组,就用二维输出,题目给的a是一维数组,要是在最后
输出个a,就会报错,题目上这种用法我从来没在书上见过,但是试了一下又可以运行

sunrise085 发表于 2020-3-17 21:33:19

张世来4610484 发表于 2020-3-17 20:53
但是照你这么想的话,没有给q定义二维数组,就用二维输出,题目给的a是一维数组,要是在最后
输出个a ...

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

算了不和你争辩了。你若还是不理解那就找你的老师去问问吧。我是不知道该怎么解释了

4goodworld 发表于 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;
        int k;
        for (k = 0; k < 4; k++) {
                q = &a ;
        }
        /*
                k=0
                q={2,4,6……,24}
                k=1
                q={8,10,12……,24}
                k=2
                q={14,16,18……,24}
                k=3
                q={20,22,24}
        */
        printf("%d\n", q);


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

张世来4610484 发表于 2020-3-18 11:34:16

sunrise085 发表于 2020-3-17 21:33
。。。。。。
一维数组的数组名有时候可以和指针换着用。若a是一维数组,那么a就是确定的变量咯,怎 ...

我还是不能理解q为什么可以这么写,,,我太难了

人造人 发表于 2020-3-18 15:15:54

张世来4610484 发表于 2020-3-18 11:34
我还是不能理解q为什么可以这么写,,,我太难了

去学汇编语言

墨羽岚 发表于 2020-3-18 16:23:09

https://zhidao.baidu.com/question/1304089356848302819.html

村上猫 发表于 2020-3-18 16:29:26

张世来4610484 发表于 2020-3-17 15:56
可是q是个一维指针数组,为什么可以用二维的来表示,还不出错

因为在你定义一个数组的时候,例如;int a[] = {1, 2, 3, 4, 8};
int* p = a;

数组名a的值是数组的首地址,也就是a的地址。而指针变量的值也是地址。只要它们两个的类型是一样的,比如都是int型。同时p等同于a;p等同于a
在程序执行的过程中,其实就是通过首地址a,自增i,来找到数组下标i所在内存单元,并取出值的,跟指针没有什么本质区别。

村上猫 发表于 2020-3-18 20:27:39

4goodworld 发表于 2020-3-17 21:44
这个我感觉最关键的是理解
指针=数组取地址
所以q是一个指针数组(数组元素全为指针变量的数组称为 ...

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

4goodworld 发表于 2020-3-18 21:14:12

村上猫 发表于 2020-3-18 20:27
不是你代码注释上面写的东西,指针变量的值就是一个地址,q仅仅是告诉了你首地址,但是并没有告诉你它 ...

你说得有道理,确实应该改下
页: [1]
查看完整版本: 指针数组问题