Chinaunix首页 | 论坛 | 博客

apt

  • 博客访问: 381054
  • 博文数量: 121
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-10 15:52
文章分类

全部博文(121)

文章存档

2017年(2)

2016年(23)

2015年(96)

我的朋友

分类: C/C++

2015-05-21 17:03:58

*在指针定义时是说明符或者修饰符,用来说明它后面的标识符是指针。引用时用于各种指针名的左边,表示回去该指针所指向的变量或对象的值(求值)。

&作用于变量名、数组元素名、成员名和对象名的左边,表示所指向的变量或对象的值。

 

声明:虽然数组名不是指针,但是用的很像指针,我们暂且把它叫做一个指针吧。

int a[10];  a &a&a[0] 都是分别是什么?先说明&a&a[0]三个值是的相等:

a叫做数组名,是数组首元素的地址,也就是&a[0]的值。像是一个指针类型,是一个int型的指针类型,int *,先理解成指针吧。

&a这才是一个真正的指针,是一个数组指针。是数组的地址。

切记:&a不是指向指针的指针,因为&aa的值相等,但是*&a*a的值也相等,这是因为&a其实就是数组的首地址。这里的数组指针&a取值之后,变成了a,是a,不是*a,变成了这个数组的数组名,或者说是数组首元素的地址,所以两者是相等的。
看下程序:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2.  int main()
  3.  {
  4.     int a[5]={1,2,3,4,5};
  5.     printf("a=%x\n",a);
  6.     printf("*a=%x\n",*a);
  7.     printf("&a=%x\n",&a);
  8.     printf("*(int*)&a=%x\n",(*((int*)(&a)))); printf("*&a=%x\n",(*(*(&a))));
  9.     printf("&a[0]=%x\n",&a[0]);
  10.     printf("*&a[0]=%x\n",*(&a[0]));
  11.     return 0;
  12.  }
输出结果是:

点击(此处)折叠或打开

  1. a=bf85b15c //表示数组首地址
  2. *a=1 //取数组首地址指向的值
  3. &a=bf85b15c //数组首地址的地址,就是本身。
  4. *(int*)&a=1 //首先取地址的地址,即还是首地址本身,然后取地址指向的值,即数组第一个值
  5. *&a=1 //与上面类似
  6. &a[0]=bf85b15c //数组首地址
  7. *&a[0]=1 //数组首地址指向的值。

数组首地址和指针相似,但是不同。定义指针并且给指针赋值后,除了指针所指向的内存空间外,指针的存放也需要空间,所以定义并初始化指针后,牵扯到两个地址空间,如下图;而数组不同,定义了一个数组,空间当即分配,操作数组永远只是在这一个空间中,所以不管对数组首地址怎样取地址,还是本身(上面)。



阅读(1159) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~