数组,指针,问题
题目,输出二维数组元素的值#include <stdio.h>
void main ()
{
static int a={{2,4,6,8},{10,12,14,16},{18,20,22,24}};
int (*ptr);
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里面a,a,&a,*a,&a这五个值不是一样的吗,比如说首地址a为2000,那么这五个是不是都等于2000,
第一个问题是这五个中区分行地址和列地址是依据什么来分的?
第二个问题是
ptr=a;
既然这五个值相等,那么我换成ptr=a;或ptr=*a;或ptr=&a;会出现这样的错误error C2440: '=' : cannot convert from 'int *' to 'int (*)'
但换成ptr=&a;又可以是怎么回事?
第三个问题:书上说“指向整形变量的指针变量ptr只能指向a,*(a+i),&a等指向列的地址,而不能指向a+i,&a等指向行的地址”我自己试了只有
ptr=a;和ptr=&a可以,这不都是指向行的地址吗,怎么跟书上说的刚好相反?求各位解答,麻烦详细点,新人不太懂
对,没错
值是相同的,但是类型不一样
ptr的类型是int (*)
&a的类型是 int *
值相同,但是类型不一样
int a = 123;
int b = 123.0;
值相同,但是类型不一样
“这五个中区分行地址和列地址是依据什么来分的”
类型,类型不一样 你怎么还在问这个问题!!!! 人造人 发表于 2020-3-1 18:43
对,没错
值是相同的,但是类型不一样
int (*)和int *是依据什么区分的呢 major_lyu 发表于 2020-3-1 18:33
你怎么还在问这个问题!!!!
等你给我解答,你不解答,我就自己悬赏问了 张世来4610484 发表于 2020-3-1 18:54
int (*)和int *是依据什么区分的呢
这是两个不同的类型 人造人 发表于 2020-3-1 18:58
这是两个不同的类型
我是问怎么知道&a是int *类型 张世来4610484 发表于 2020-3-1 22:27
我是问怎么知道&a是int *类型
a 是 int类型,能明白吧?
&a 取int类型的地址就是 int * 呀,有问题吗? 行地址和列地址应该是根据数组的行列来区分的吧,比如&a,&a,&a之类的应该是行地址,而&a,
&a,&a,&a 之类的应该是列地址(i为行)。
数组中有首地址这个概念,二维数组中,a为整个二维数组的首地址,相当于第一个一维数组的地址(&a),通过解引用*a之后可以得到a,为第一个一维数组的首地址(同理*(a+i)为a的首地址 ),而*a再次解引用( *(*a) )便得到一个整型的数组元素。
int (*ptr) 为一个数组指针,指向的是一个拥有4个元素的一维数组,因此,需要一个一维数组的地址,即
ptr = (a+i),a 相当于a第一个元素的地址(&a),类型为int *,显然不可以,*a等同于a,&a就不用说了。
指向整型变量的指针,不是指向数组的指针。在二维数组中的数组指针如int(ptr*)还有一个别名,叫行指针,顾名思义一样指向行,至于指向整型变量的指针(int *ptr),显然只能指向整型变量,而二维数组中的整型变量为a,其地址为&a,或者a 对于二维数组,a可以看做数组a的首元素,所以a就是a的地址。
但&a【0】 &a存放的是地址
*a输出这个地址存放的数
C:\Users\user\Desktop\2.jpg 你看看这这图,看看能不能理解! 本帖最后由 4goodworld 于 2020-3-5 16:55 编辑
张世来4610484 发表于 2020-3-1 22:27
我是问怎么知道&a是int *类型
代码是你写的,你会不会知道它是什么类型吗?{:10_277:}
关于楼主提的这些问题,我个人的观点,你对数组的理解或者指针的理解还没有吃透,特别是指针这块的,我建议你再去找些视频或者教材,多围绕指针再学习下,有些时候,很多为什么都没有为什么的,因为这是规定或者叫做约定,就像为啥红灯停,绿灯行,从物理上看好像是红灯的在大雾里的传透性更强,但是从实际使用的角度来看,“啥科学道理”,国家这么规定,我们就这么遵守不就行了吗?要是没有交规,你红灯行绿灯停有什么不可以呢?不出事就行了
同理,就像你问的一些问题,归根到底是内存地址的问题,但你又不研究逆向的,你只要知道指针遇到这个情况这么用就行了,何必追究指针背后的意义呢? 刚看到谭浩强C语言二维数组概念
a是数组首元素的地址,即&a.,
*(a+i)等价于a应该是值吧
a指向首元素的地址即&a
指向a,指针加一进一行
指向a,指针加一进一个元素
页:
[1]