关闭

数组与指针,&a和a

标签: C语言指针
477人阅读 评论(0) 收藏 举报

今天无意中看到一道题目,考察的是数组与指针,如下

int a[5] = {1,2,3,4,5};
int *ptr1 = (int *)(a + 1);
int *ptr2 = (int *)(&a + 1);
printf("%d %d\n" , *ptr1, *(ptr2-1));
初一看,我想的答案是2,1,因为a是数组名称,也就是数组的首地址,a+1指向的就是数组的第二个元素了,也就是2,所以打印的是2,&a+1也是这样理解的,先+1再-1,那应该输出的是数组的第一个元素了,但是上机运行,输出的是2,5,感觉很不解,于是用了下面这个语句去查各个元素分配的地址

printf("%p %p %p %p %p %p %p %p %p\n", a, &a, &a[0], &a[1], &a[2], &a[3], &a[4], ptr1, ptr2);

打印出来的结果是0022FE84 0022FE84 0022FE84 0022FE88 0022FE8C 0022FE90 0022FE94 0022FE88 0022FE98

从这个结果可以看出a,&a[0],&a这三者在数值上是一样的,都表示了数字a的首地址,但是a+1和&a+1的结果却是完全不同的,后来查了资料,原来a的数据类型是int *,而&a的数据类型是int (*)[5],于是sizeof(&a)=5*sizeof(int)=20,所以&a+1实际上跳过了整块的a所分配的内存地址,也就是越界了,ptr2-1将指针拉回到数组a所在的地址区域,指向了a[4],所以会输出5,至此这道题我算是理解了。从这里看出,C语言中的指针真的是很灵活,需要用心去体会了。




0
0
查看评论

当a为数组时a和&a还是有区别的

<br />  假设有int a[];那么a实际上是数组a的首元素a[0]的首地址,而&a是数组的首地址,其值和&a[0]相等,但是两者的意义不同,这一点可以从指针的移动运算方面得到验证。且看下面程序:<br />#include<stdio....
  • collier
  • collier
  • 2010-09-06 11:57
  • 1227

[C/C++]数组与指针——a,a[0],&a,&a[0]区别小结

1.a,a[0],&a,&a[0] 通过在VS上实验,以下是关于C语言中数组与指针的关系——a,a[0],&a,&a[0]之间的区别小小的总结 对于二维数组a[3][5] a         int(*)[5]类型 ...
  • YupingLiu
  • YupingLiu
  • 2014-01-29 12:16
  • 1685

如何理解指针和数组char * a, char ** a, char * a[], char a[][], char * a[][], char ** a[][], char * a [][][]

[转自:http://blog.163.com/digoal@126/blog/static/163877040201271195312138/] 本文测试环境 :  X86-64 bit 架构的服务器 CentOS x64 5.x gcc version 4.1....
  • b2292486308
  • b2292486308
  • 2017-07-19 08:57
  • 432

对数组元素a[i]可以写成*(a+i)对指针pa在表达式pa[i]也可以写成*(pa+i)

a[i]可以写成*(a+i) 如果对这2种形式分别
  • leafinsnowfield
  • leafinsnowfield
  • 2014-10-02 09:21
  • 641

数组中&a与&a[0]的区别

在探讨这个问题之前,我们首先来看一道笔试题,如下:   【摘自牛客网】下列代码的结果是:(正确答案是 C)main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d&qu...
  • FX677588
  • FX677588
  • 2017-07-09 10:34
  • 592

【指针】指向数组的指针--(课堂例)为什么p=a不对?

上机内容:C++程序的编写和运行 上机目的:掌握简单C++程序的编辑、编译、连接和运行的一般过程 我的程序:/* Copyright (c) 2013, 烟台大学计算机学院 * All rights reserved. * 作 者:赵玲玲 * 完成日期:2013 年 12 月 14 日 * 版...
  • u012370487
  • u012370487
  • 2013-12-14 13:33
  • 634

C语言中指针与数组的区别与联系

好久不写东西了,从毕业以来,整个人都懒散了很多。今天终于鼓起勇气,来写一点儿东西…… 指针与数组对于C语言程序员来说肯定不会陌生,一说起这个话题,我就想起了曾经被内存、地址、地址里的内容这些概念狂虐时的情形。
  • cyfcsd
  • cyfcsd
  • 2017-02-03 17:29
  • 4398

数组与指针关系

1
  • App_12062011
  • App_12062011
  • 2013-09-15 20:25
  • 3333

【C代码练习23】用指针寻找数组中的最大值和最小值

#include void minmax(int a[], int len, int *min, int *max); int main() { int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,0}; int min, max;...
  • qq_15971883
  • qq_15971883
  • 2017-12-27 17:11
  • 62

C语言指针与数组易混淆知识点(一)

一指针与数组 二指针与函数 三指针数组数组指针指向指针的指针 四程序陷阱 一、指针与数组指针:指针本身也是一个变量,它的内容是指向的内容的地址。指针同样有类型的区分,char 的指针只能指向char型数据,int 指针指向int型数据。但是指针所占内存单元的大小(即其内容)是跟操作系统的地址位数有关...
  • woshimalingyi
  • woshimalingyi
  • 2016-03-25 15:59
  • 2989
    个人资料
    • 访问:16526次
    • 积分:294
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:4篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论