鱼C论坛

 找回密码
 立即注册
查看: 1673|回复: 13

[已解决]数组,指针,问题

[复制链接]
发表于 2020-3-1 18:28:38 | 显示全部楼层 |阅读模式
5鱼币
题目,输出二维数组元素的值
#include <stdio.h>
void main ()
{
        static int a[3][4]={{2,4,6,8},{10,12,14,16},{18,20,22,24}};
        int (*ptr)[4];
        int i,j;
        ptr=a;
        for(i=0;i<3;i++)
        {
                for(j=0;j<4;j++)
                        printf("%4d",*(*(ptr+i)+j));
                printf("\n");
        }
}

问题:二维数组a[3][4]里面a,a[0],&a[0],*a,&a[0][0]这五个值不是一样的吗,比如说首地址a为2000,那么这五个是不是都等于2000,
第一个问题是这五个中区分行地址和列地址是依据什么来分的?
第二个问题是
 ptr=a;
既然这五个值相等,那么我换成ptr=a[0];或ptr=*a;或ptr=&a[0][0];会出现这样的错误error C2440: '=' : cannot convert from 'int *' to 'int (*)[4]'
但换成ptr=&a[0];又可以是怎么回事?
第三个问题:书上说“指向整形变量的指针变量ptr只能指向a[i],*(a+i),&a[i][0]等指向列的地址,而不能指向a+i,&a[i]等指向行的地址”我自己试了只有
ptr=a;和ptr=&a[0]可以,这不都是指向行的地址吗,怎么跟书上说的刚好相反?求各位解答,麻烦详细点,新人不太懂

最佳答案
2020-3-1 18:28:39
对,没错
值是相同的,但是类型不一样

ptr的类型是int (*)[4]
&a[0][0]的类型是 int *

值相同,但是类型不一样
int a = 123;
int b = 123.0;

值相同,但是类型不一样

“这五个中区分行地址和列地址是依据什么来分的”
类型,类型不一样

最佳答案

查看完整内容

对,没错 值是相同的,但是类型不一样 ptr的类型是int (*)[4] &a[0][0]的类型是 int * 值相同,但是类型不一样 int a = 123; int b = 123.0; 值相同,但是类型不一样 “这五个中区分行地址和列地址是依据什么来分的” 类型,类型不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-1 18:28:39 | 显示全部楼层    本楼为最佳答案   
对,没错
值是相同的,但是类型不一样

ptr的类型是int (*)[4]
&a[0][0]的类型是 int *

值相同,但是类型不一样
int a = 123;
int b = 123.0;

值相同,但是类型不一样

“这五个中区分行地址和列地址是依据什么来分的”
类型,类型不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-1 18:33:07 | 显示全部楼层
你怎么还在问这个问题!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-1 18:54:13 | 显示全部楼层
人造人 发表于 2020-3-1 18:43
对,没错
值是相同的,但是类型不一样

int (*)[4]和int *是依据什么区分的呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-1 18:54:54 | 显示全部楼层
major_lyu 发表于 2020-3-1 18:33
你怎么还在问这个问题!!!!

等你给我解答,你不解答,我就自己悬赏问了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-1 18:58:13 | 显示全部楼层
张世来4610484 发表于 2020-3-1 18:54
int (*)[4]和int *是依据什么区分的呢

这是两个不同的类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-1 22:27:59 | 显示全部楼层
人造人 发表于 2020-3-1 18:58
这是两个不同的类型

我是问怎么知道&a[0][0]是int *类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-1 22:49:48 | 显示全部楼层
张世来4610484 发表于 2020-3-1 22:27
我是问怎么知道&a[0][0]是int *类型

a[0][0] 是 int类型,能明白吧?
&a[0][0] 取int类型的地址就是 int * 呀,有问题吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-2 11:02:51 | 显示全部楼层
行地址和列地址应该是根据数组的行列来区分的吧,比如&a[0],&a[1],&a[2]之类的应该是行地址,而&a[i][0],
&a[i][1],&a[i][2],&a[i][3] 之类的应该是列地址(i为行)。
数组中有首地址这个概念,二维数组中,a为整个二维数组的首地址,相当于第一个一维数组的地址(&a[0]),通过解引用*a之后可以得到a[0],为第一个一维数组的首地址(同理*(a+i)为a[i]的首地址 ),而*a再次解引用( *(*a) )便得到一个整型的数组元素。
int (*ptr)[4] 为一个数组指针,指向的是一个拥有4个元素的一维数组,因此,需要一个一维数组的地址,即
ptr = (a+i),a[0] 相当于a[0][4]第一个元素的地址(&a[0][0]),类型为int *,显然不可以,*a等同于a[0],&a[0][0]就不用说了。
指向整型变量的指针,不是指向数组的指针。在二维数组中的数组指针如int  (ptr*)[4]还有一个别名,叫行指针,顾名思义一样指向行,至于指向整型变量的指针(int *ptr),显然只能指向整型变量,而二维数组中的整型变量为a[i][j],其地址为&a[i][j],或者a[i]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-3 09:36:38 | 显示全部楼层
对于二维数组,a[0][0]可以看做数组a[0]的首元素,所以a[0]就是a[0][0]的地址。
但&a【0】    &a[0][0]存放的是地址
*a输出这个地址存放的数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-4 20:57:02 | 显示全部楼层
C:\Users\user\Desktop\2.jpg

你看的懂吧

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

使用道具 举报

发表于 2020-3-4 20:59:40 | 显示全部楼层
你看看这这图,看看能不能理解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-5 16:47:40 | 显示全部楼层
本帖最后由 4goodworld 于 2020-3-5 16:55 编辑
张世来4610484 发表于 2020-3-1 22:27
我是问怎么知道&a[0][0]是int *类型


代码是你写的,你会不会知道它是什么类型吗?

关于楼主提的这些问题,我个人的观点,你对数组的理解或者指针的理解还没有吃透,特别是指针这块的,我建议你再去找些视频或者教材,多围绕指针再学习下,有些时候,很多为什么都没有为什么的,因为这是规定或者叫做约定,就像为啥红灯停,绿灯行,从物理上看好像是红灯的在大雾里的传透性更强,但是从实际使用的角度来看,“啥科学道理”,国家这么规定,我们就这么遵守不就行了吗?要是没有交规,你红灯行绿灯停有什么不可以呢?不出事就行了
同理,就像你问的一些问题,归根到底是内存地址的问题,但你又不研究逆向的,你只要知道指针遇到这个情况这么用就行了,何必追究指针背后的意义呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-5 23:48:06 | 显示全部楼层
刚看到谭浩强C语言二维数组概念
  a是数组首元素的地址,即&a[0].,
   *(a+i)等价于a[i]应该是值吧
a[0]指向首元素的地址即&a[0][0]
指向a,指针加一进一行
指向a[0],指针加一进一个元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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