A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丶白菜你个小番 中级黑马   /  2014-7-20 13:54  /  1471 人查看  /  15 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 丶白菜你个小番 于 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];
求哪位大大告诉我这两个区别?赋值时怎样的?

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

15 个回复

倒序浏览
fantacyleo 来自手机 金牌黑马 2014-7-20 14:07:20
沙发
爪机不方便说太多。简单说,数组名是指向数组首元素的指针。数组a[3][2]的首元素是什么?不是a[0][0],而是a[0]
回复 使用道具 举报
fantacyleo 发表于 2014-7-20 14:07
爪机不方便说太多。简单说,数组名是指向数组首元素的指针。数组a[3][2]的首元素是什么?不是a[0][0],而是 ...

a[0]的地址和a[0][0]有区别吗
回复 使用道具 举报
丶白菜你个小番 发表于 2014-7-20 14:54
a[0]的地址和a[0][0]有区别吗

我是指地址
回复 使用道具 举报
fantacyleo 发表于 2014-7-20 14:07
爪机不方便说太多。简单说,数组名是指向数组首元素的指针。数组a[3][2]的首元素是什么?不是a[0][0],而是 ...

我是指a[0]和a[0][0]的地址
回复 使用道具 举报
fantacyleo 来自手机 金牌黑马 2014-7-20 15:14:54
地板
丶白菜你个小番 发表于 2014-7-20 14:57
我是指a[0]和a[0][0]的地址

地址是一样的
回复 使用道具 举报

那为什么取值不是a【0】【0】呢
回复 使用道具 举报
fantacyleo 来自手机 金牌黑马 2014-7-20 16:15:10
8#
丶白菜你个小番 发表于 2014-7-20 15:49
那为什么取值不是a【0】【0】呢

因为首元素不是a[0][0],而是a[0]啊。你到了那个地址,到底是往后读1个字节,2个字节还是4个字节?这必须由首元素的类型决定。
回复 使用道具 举报
fantacyleo 发表于 2014-7-20 16:15
因为首元素不是a[0][0],而是a[0]啊。你到了那个地址,到底是往后读1个字节,2个字节还是4个字节?这必须 ...

嘿嘿。谢谢啊!
回复 使用道具 举报
本帖最后由 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]地址

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

评分

参与人数 2技术分 +1 黑马币 +5 收起 理由
傘が咲く + 1
fantacyleo + 5 很给力!

查看全部评分

回复 使用道具 举报
一个是一维数组的首元素地址,一个是二维数组的首元素地址
回复 使用道具 举报
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);
回复 使用道具 举报
Melody_cw 发表于 2014-7-20 21:01
楼主,我又研究了一下,补充下
你想用指针来输出数组的话可以这样
#include

。谢谢啦
回复 使用道具 举报

没关系,我也是初学者,回答的朦朦胧胧的,也不知道有没有帮到你,也算是给自己积累了一些知识吧
回复 使用道具 举报
楼主,如果你明白了,麻烦改为提问结束吧~谢谢了!
回复 使用道具 举报
楼主,如果你明白了,麻烦改为提问结束吧~谢谢了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马