| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 464 人关注过本帖, 1 人收藏
标题:一个指针语ju该如何理解
只看楼主 加入收藏
小花之清
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2013-3-27
结帖率:75%
收藏(1)
已结贴  问题点数:18 回复次数:7 
一个指针语ju该如何理解

int a[5];
int *ptr=(int *)(&a+1)  ptr这个指针变量是指向a[1],还是a[5]?
搜索更多相关主题的帖子: 如何 
2013-03-27 20:23
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:6 
啥也不是

DO IT YOURSELF !
2013-03-27 20:26
小花之清
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2013-3-27
收藏
得分:0 
回复 2楼 wp231957
这里的a变成了数组指针?
2013-03-27 20:32
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
程序代码:
#include<stdio.h>
void main()
{ 
    int a[5]={8,8,8,8,8};
    int *ptr=(int*)((int)(&a)+4);
    printf("首元素地址=%d\n 次元素地址=%d\n 次元素=%d\n ptr=%d\n",&a[0],&a[1],a[1],*ptr);
}
你运行一下这个代码 试试看

DO IT YOURSELF !
2013-03-27 20:37
shmilyflf
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:356
专家分:1008
注 册:2012-12-9
收藏
得分:6 
指向a[5],你自己试试就知道了。
a和a[0]是不一样的,他们的地址是一样的,但是a是指的整个数组这么一个整体的首地址,a[0]是数组的首地址。
当然C中没有对象,不过我拿对象举个例子:a是把整个数组看作一个对象,而a[0]是把每个数组元素看作一个对象。(你要是不了解对象的概念,这里不看也行)
所以,&a+1是向后一个a数组的长度这里就是5个int的长度,所以int *ptr=(int *)(&a+1);后ptr指向了a[4]后面的地址,也就可以理解为a[5];
而&a[0]+1是向后一个数组元素的长度这里就是一个int的长度,所以如果int *ptr=(int *)(&a[0]+1);ptr就是指向了a[1]的地址。
2013-03-27 20:46
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
应该是野指针吧 哪有a[5]啊

DO IT YOURSELF !
2013-03-27 20:49
shmilyflf
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:5
帖 子:356
专家分:1008
注 册:2012-12-9
收藏
得分:0 
程序代码:
#include<stdio.h>
int main()
{
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);
    printf("%d\n",*ptr);
    printf("%d\n",a[5]);
    return 0;
}
//这里两个输出是一样的,说明是
//指向了同一个值
2013-03-27 20:49
fanpengpeng
Rank: 8Rank: 8
来 自:南极洲
等 级:蝙蝠侠
威 望:7
帖 子:299
专家分:849
注 册:2013-2-1
收藏
得分:6 
指向你所说的a[5] 但是a[5]不存在 只能说指向a[4]的下一号单元
&a a是数组名 &a表示的是数组的地址 也就是指向数组类型的指针
但是需要注意的是 &a 和 a 的值是一样的 也就是他们指向的地址都是同一个地址 他们的区别只是类型不同
&a 和 (int (*)[5])a 是完全等价的

你上面提到:“这里的a变成了数组指针?”
说明你意识到 数组名 a 的是含义是可以变的 但是这个变是有限制的(像上面这句话就是不对的 不是a变成数组指针)
a的含义根据具体环境可以有两种解释 一是他表示数组本身 一是他被转化为指向第一个元素的指针(这里的元素可以是数组类型 也就是所说的多维数组)
但是什么时候是数组 什么时候是元素指针 我也不能几句话说清楚 只能举几个典型的例子
1. &a 这里 a 就应该表示数组本身 所以&a 表示数组类型的地址(指针) 不是说 a被转换为数组指针
2. *(a+1) a单独出现 转换为元素指针 相当于a[1]
3. sizeof(a) a是数组本身 求的值是数组的字节数
   一个比较容易出错的地方 int *p = a; sizeof(p)  != sizeof(a) p永远是指针 结果为4 而a这里不是指针 而是数组 结果是数组的大小
4. 函数形参表中 int f(int a[5]); f(a); 这里a是元素指针 函数等价于 int f(int *a);
   这里是因为函数参数不能传递数组类型 你应该听说过 上述函数申明中 5这个维数是不起作用 说的就是这个道理
大概想到的就这么几个 反正记住 数组名要么表示数组 要么表示首元素指针 不会变成别的东西 就形了

人生是一场错过 愿你别蹉跎
2013-03-27 21:38
快速回复:一个指针语ju该如何理解
数据加载中...
 
   



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

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