黑马程序员技术交流社区

标题: 关于数组与指针的问题 [打印本页]

作者: 丶白菜你个小番    时间: 2014-7-20 13:54
标题: 关于数组与指针的问题
本帖最后由 丶白菜你个小番 于 2014-7-23 20:34 编辑

int *p;
int a[]={1,2,3};
p=a;//这里可以理解为将a[0]的地址赋值给p
printf("%d\n",*p);
//这里我们都知道打出来的值是1;
int *p1[10];
int a1[3][3]={
                       {1,2,3},
                        {4,5,6},
                        {7,8,9}
                   }
p1=a1;//这里是不是将a1[0][0]给p1?
printf("%d\n",*p1);//输出的是a1[0][0]地址
printf("%d\n",**p1);//这里输出的才是a[0][0];
求哪位大大告诉我这两个区别?赋值时怎样的?


作者: fantacyleo    时间: 2014-7-20 14:07
爪机不方便说太多。简单说,数组名是指向数组首元素的指针。数组a[3][2]的首元素是什么?不是a[0][0],而是a[0]
作者: 丶白菜你个小番    时间: 2014-7-20 14:54
fantacyleo 发表于 2014-7-20 14:07
爪机不方便说太多。简单说,数组名是指向数组首元素的指针。数组a[3][2]的首元素是什么?不是a[0][0],而是 ...

a[0]的地址和a[0][0]有区别吗
作者: 丶白菜你个小番    时间: 2014-7-20 14:55
丶白菜你个小番 发表于 2014-7-20 14:54
a[0]的地址和a[0][0]有区别吗

我是指地址
作者: 丶白菜你个小番    时间: 2014-7-20 14:57
fantacyleo 发表于 2014-7-20 14:07
爪机不方便说太多。简单说,数组名是指向数组首元素的指针。数组a[3][2]的首元素是什么?不是a[0][0],而是 ...

我是指a[0]和a[0][0]的地址
作者: fantacyleo    时间: 2014-7-20 15:14
丶白菜你个小番 发表于 2014-7-20 14:57
我是指a[0]和a[0][0]的地址

地址是一样的
作者: 丶白菜你个小番    时间: 2014-7-20 15:49
fantacyleo 发表于 2014-7-20 15:14
地址是一样的

那为什么取值不是a【0】【0】呢
作者: fantacyleo    时间: 2014-7-20 16:15
丶白菜你个小番 发表于 2014-7-20 15:49
那为什么取值不是a【0】【0】呢

因为首元素不是a[0][0],而是a[0]啊。你到了那个地址,到底是往后读1个字节,2个字节还是4个字节?这必须由首元素的类型决定。
作者: 丶白菜你个小番    时间: 2014-7-20 16:59
fantacyleo 发表于 2014-7-20 16:15
因为首元素不是a[0][0],而是a[0]啊。你到了那个地址,到底是往后读1个字节,2个字节还是4个字节?这必须 ...

嘿嘿。谢谢啊!
作者: Melody_cw    时间: 2014-7-20 17:16
本帖最后由 Melody_cw 于 2014-7-20 20:46 编辑

你好,你把int *p1[10]改成int (*p)1[10]才可以以你为int *p1[10 p1是一个数组(里面存放的是int *类型的,也就是用来存放地址的数组),而int (*p)1[10]的p1是一个指向数组的指针(这里面是用来存放int数据的)
你让p1 = a1,是想把a1的地址给指针变量p1,而然起初你写的那个只是一个数组p1而不是指针
这里面将a1[0]地址给了指针变量p1(具体的远离我也不清楚,经过我验证的确是a1[0]
"intf("%d\n",*p1);//输出的是a1[0][0]地址"这里你要输出的是*p1是一个整形数据而不是地址
"ntf("%d\n",**p1);//这里输出的才是a[0][0];"这里你要输出的是**p1,也是一个整形数据,值就是a1[0]。因为指针变量p1指向的是a[0]地址

我也是刚查阅的资料才弄明白的,可能写的有点乱,希望你能明白,如果不明白,在一起讨论


作者: 此生逍遥    时间: 2014-7-20 17:37
一个是一维数组的首元素地址,一个是二维数组的首元素地址
作者: Melody_cw    时间: 2014-7-20 21:01
Melody_cw 发表于 2014-7-20 17:16
你好,你把int *p1[10]改成int (*p)1[10]才可以以你为int *p1[10 p1是一个数组(里面存放的是int *类型的, ...

楼主,我又研究了一下,补充下
你想用指针来输出数组的话可以这样
#include<stdio.h>
void main()
{
    int m[3][3]={{1,2,3},{4,5,6},{7,8,9}},(*p)[3];
    p=m;

    printf("%d ",*(*(p+1)+2));/*代表输出第2行的,第3个元素也就是6。有一个固定的模式是*(*(p+i)+j) i是行,j是列。我也是刚学到的*/
}

还有就是你想输出*p1和**p1,应该这样写printf("%p",*p1); printf("%p",**p1);
作者: 丶白菜你个小番    时间: 2014-7-20 21:50
Melody_cw 发表于 2014-7-20 21:01
楼主,我又研究了一下,补充下
你想用指针来输出数组的话可以这样
#include

。谢谢啦
作者: Melody_cw    时间: 2014-7-20 22:14
丶白菜你个小番 发表于 2014-7-20 21:50
。谢谢啦

没关系,我也是初学者,回答的朦朦胧胧的,也不知道有没有帮到你,也算是给自己积累了一些知识吧
作者: Melody_cw    时间: 2014-7-23 08:18
楼主,如果你明白了,麻烦改为提问结束吧~谢谢了!
作者: Melody_cw    时间: 2014-7-23 08:19
楼主,如果你明白了,麻烦改为提问结束吧~谢谢了!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2