| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1627 人关注过本帖
标题:指针与数组
只看楼主 加入收藏
星空好学生
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-12-16
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:8 
指针与数组
老师说数组变量可以被看作是const的指针变量,到底是“可以被看作”,还是“就是”指针呢?
2015-12-16 20:45
kehanping
Rank: 2
等 级:论坛游民
威 望:1
帖 子:25
专家分:88
注 册:2015-12-10
收藏
得分:3 
应该是数组名吧,数组名是地址,是const的地址!
2015-12-16 21:19
autumnyellow
Rank: 2
等 级:论坛游民
帖 子:72
专家分:75
注 册:2015-4-14
收藏
得分:3 
路过
2015-12-16 23:27
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:3 
都不对
差别是前者算不严谨,后者算是傻屄

后者我就不说了,只说前者
int a[100];
int* const p = a;
&a 和 &p 的类型分别是什么?
2015-12-17 09:01
星空好学生
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2015-12-16
收藏
得分:0 
回复 4楼 rjsp
原谅我是个渣渣 不懂你说的
2015-12-17 17:01
杨少爷
Rank: 1
来 自:山东聊城
等 级:新手上路
帖 子:1
专家分:0
注 册:2015-12-15
收藏
得分:0 
回复 4楼 rjsp
&那不是“取地址”符吗?
如果问&p是什么型?
只能说是整型!!!   我是菜鸟

我要当世界第一!
2015-12-17 17:19
ms268el8
Rank: 4
等 级:业余侠客
威 望:1
帖 子:84
专家分:299
注 册:2015-11-30
收藏
得分:0 
回复 4楼 rjsp
#include <stdio.h>
int main()
{
    int a[100];
    int* const p = a;
    printf("&a=%p\n&p=%p\n&a[0]=%p\np=%p", &a, &p, &a[0], p);
    return 0;
}


執行結果
&a=0xbe89a6b4
&p=0xbe89a844
&a[0]=0xbe89a6b4
p=0xbe89a6b4
&a=&a[0]=p
所以&a是a數組的第一個元素位址
a數組名稱實際上不佔用記憶體空間
而指標p佔用記憶體空間上的0xbe89a844位址,內容為0xbe89a6b4,即指向a數組的第一個元素。
不知道有沒有錯,有錯求指正

[此贴子已经被作者于2015-12-17 20:13编辑过]

2015-12-17 20:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 6楼 ms268el8
對的

授人以渔,不授人以鱼。
2015-12-17 21:00
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
好多教科书都有这种说法,尽管“相当于”不是“就是”、“等于”,但很容易让学生产生概念混淆。
首先要搞清楚常数和常量:int a,const b;a=5//把常数5给a;a=b;//把常量b的值给a.
我认为:将“数组名”赋值给一个指针,这时的“数组名”不是常量,而是一个常数,常量和常数虽然共同点是不能更改,但有很大的区别。常量需要定义,在数据区开辟存储空间,而常数不需要定义,是和指令一起走的,从汇编的角度看,c编译器的&运算和宏定义都最后被编译器编译成一个常数和指令出现在代码区,也称为指令操作数(立即数)。
当然,要在c编译后的汇编指令里看常数和常量的区别,需要将数据定义为全局变量,这些变量在静态区,定义后地址确定。如果在函数内部定义,由于是定义在栈中,地址不确定,编译器对取地址运算不会送入常数,会是基于栈的基址做相对的变址运算(寄存器变址),相当于送常数,因为寄存器的值在每次进入调用的函数后是确定的。通过下例可大致看到“数组名”会是一个常数给指针赋值:
1:    #include <stdio.h>
2:    int *p,a[20];  //定义全局变量*p,a[20]
3:    void main()
4:    {
...//一大堆准备工作的汇编码省略
5:        int b;     //定义局部变量b
6:        p=a;
   mov   dword ptr [p (00422808)],offset a (004227b8) //将数组名a给指针p,其实是将常数004227b8赋值给p,004227b8是数组a的首地址
7:        p=&a[1];
   mov   dword ptr [p (00422808)],offset a+4 (004227bc) //&运算实际上是将常数004227bc给指针p,004227bc是数组a[1]的地址
8:        p=&b;
   lea   eax,[ebp-4]  //方括号一般是寻址传值,但lea是传送有效地址指令,方括号内的ebp-4就是有效地址
   mov   [p (00422808)],eax  //局部变量&运算,是将寄存器ebp的值减4后送给指针p,ebp的值恒等于栈顶(栈从高位递减)
9:    }
...//一大堆函数返回前的恢复代码省略
   ret


[此贴子已经被作者于2015-12-17 23:33编辑过]


能编个毛线衣吗?
2015-12-17 22:38
快速回复:指针与数组
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024892 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved