对数组名取地址 a[ ],&a
C语言规定,数组名代表数组的首地址,也就是第0号元素的地址。所以a==&a[0]
但对数组名取地址时却要注意了,在理解“对数组名取地址”这一表达式的含义时一定要记住:数组名是“数组”这种变量的变量名
这样,&a就好理解了,它取的是“数组”这种变量的地址
&a+1自然也就要跨过整个数组,所有元素长度总和,这么长的一个长度。例如:int a[10],那么&a+1就要跨过10个int的长度
详细分析——
1 int array[100];
2
3 memset(array, 0, sizeof(array));
4 memset(&array, 0, sizeof(array));
第3行和第4行有什么不同吗?其实从效果上来说是一样的,但是这里要注意 array 和 &array 的类型是不同的。
array 相当于 &array[0],它们都是整型指针。而 &array 是一个指向 int[100] 的指针,这是一个数组指针,类型是 int(*)[100],当用数组指针变量来接收它的值时,你会发现它与整型指针array、&array[0]的巨大不同。
以下代码可以看出这个不同:
#include <stdio.h>
int main()
{
int array[100] = {0, 1, 2};
typedef int (*ARRAY)[100];
int *p1 = array;//数组名代表第0号元素的地址(准确的说应该是代表第0号元素的指针):&array[0],第0号元素是一个整型变量
ARRAY p2 = &array;
int *p3 = &array;//实际上赋值符自动向下兼容,将&array转换为了一个整型变量指针:&array[0]
//或者可能是像空指针可以接收所有类型的指针值一样,各类型的指针都可以接收自己类型的数组指针,并完成兼容性转换,例如int型指针可以接收int数组的数组指针,并转换为int型指针;char型指针可以接收char数组的数组指针,并转换为char型指针。
printf("p1 = 0x%08d\n", p1);
printf("p2 = 0x%08d\n", p2);
printf("p3 = 0x%08d\n", p3);
printf("int=%dbyte\n",sizeof(int));
printf("p1+1=0x%08d\n",p1+1);
printf("p2+1=0x%08d\n",p2+1);
printf("p3+1=0x%08d\n",p3+1);
printf("p1[2] = %d\n", p1[2]);
printf("p2[2] = %d\n", p2[2]);
printf("p3[2] = %d\n", p3[2]);
printf("(*p2)[2] = %d\n", (*p2)[2]);
//printf("(*p1)[2] = %d\n", (*p1)[2]);//这样编译错误
//printf("(*p3)[2] = %d\n", (*p3)[2]);//这样编译错误
getchar();
return 0;
}
运行结果可能是:

从上面的分析以及程序可以发现:
指针与地址其实还是有差异的,指针的属性中包含有地址这个概念,而且对于不同的指针,其地址概念却都是相同的,都是用一个数表示内存条上的某个位置。
但指针的属性中还有大小、距离的概念:
大小——不同类型的指针,其指向的变量所占据的内存大小不同,即从内存条上的起始位置(即地址)开始,所占据的字节数不同。例如int占4个byte,char占1个byte
距离——不同类型的指针移动一个单位,其在内存条上移动的字节数不同。例如int型指针+1则移动4个byte,char型指针+1则移动1个byte,数组型指针+1则移动许多许多个byte
对数组名取地址 a[ ],&a的更多相关文章
- C语言的数组名和对数组名取地址
http://blog.csdn.net/zdcsky123/article/details/6517811 相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针, ...
- C语言 对数组名取地址
作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 演示样例: int a[5] = {1,2,3,4,5}; int *p = (int * ...
- 数组名取地址所算数运算应注意的"trap"
数组名取地址所算数运算应注意的"trap" 直接看代码: #include <stdio.h> int main() { int array[5]; printf(&q ...
- C语言中对数组名取地址
在C/C++中,数组名相当于一个指针,指向数组的首地址.这里“相当于”不代表等于,数组名和指针还是有很多区别的,这个在<C陷阱与缺陷>里有详尽的讲述.而这里要说的是对于数组名取地址的这么一 ...
- 搬运1:关于对C语言中数组名取地址加减等操作的一点探究
对于数组名取地址强制转换的操作 偶然在晚上学了C语言指针后网页闲逛找题时,被一个数组名取地址搞糊涂了,在自己试验加探索后我稍微悟了一点东西. 代码如下: #include<stdio.h> ...
- 数组名和数组名取地址&
在C中, 在几乎所有使用数组的表达式中,数组名的值是个指针常量,也就是数组第一个元素的地址. 它的类型取决于数组元素的类型: 如果它们是int类型,那么数组名的类型就是“指向int的常量指针“ ...
- 对数组名取地址&a和 数组首地址a
#include <iostream> using namespace std; ] = {,,,,}; int main() { cout<<a<<" ...
- C语言指令数组名和数组名取地址
以下C语言指令:int a[5] = {1, 3, 5, 7, 9}; int *p = (int *)(&a + 1); printf("%d, %d", *(a + 1 ...
- C语言数组名取地址。。。
int main(){ int a[5] = { 1, 2, 3, 4, 5 }; printf("%08X ,%08X ,%08X ,%08X", a, &a, a + ...
随机推荐
- review12
使用StringTokenizer对象分解字符串,和split()不同的是,StringTokenizer对象不使用正则表达式作为分隔标记. 当Fenix一个字符串并将字符串分解成可被独立使用的单词时 ...
- review02
位运算符 按为与运算符和按位或运算符都是二目运算符 按位非运算符是单目运算符 按位异或运算符的法则有: a^a=0; a^0=a; a^b^b=a; instanceof是二目运算符,左边的操作是一个 ...
- setintervalue传参数的三种方法
http://www.cnblogs.com/wkylin/archive/2012/09/07/2674911.html http://www.bhcode.net/article/20110822 ...
- 关于html的一些杂技
html预定义字符指的是 :< > html实体指的是 $amp 等 php中htmlspeciachar()就是讲html预定义字符转换成html实体. 浏览器渲染时,会将html实 ...
- 机器学习(六)—随机森林Random Forest
1.什么是随机采样? Bagging可以简单的理解为:放回抽样,多数表决(分类)或简单平均(回归): Bagging的弱学习器之间没有boosting那样的联系,不存在强依赖关系,基学习器之间属于并列 ...
- 51nod 1257 01分数规划/二分
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1257 1257 背包问题 V3 基准时间限制:3 秒 空间限制:1310 ...
- 逻辑斯蒂(logistic)回归深入理解、阐述与实现
第一节中说了,logistic 回归和线性回归的区别是:线性回归是根据样本X各个维度的Xi的线性叠加(线性叠加的权重系数wi就是模型的参数)来得到预测值的Y,然后最小化所有的样本预测值Y与真实值y'的 ...
- 33 python 并发编程之IO模型
一 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非 ...
- NHibernate常见错误汇总
NHibernateSample.Data.Test.QueryHQLFixture.WhereTest: NHibernate.Hql.Ast.ANTLR.QuerySyntaxException ...
- nyoj-1278-Prototypes analyze(二叉排序树模板)
题目链接 思路:建树之后,判断有多少种不同的树. 判断不同的树,简单的思路是遍历数组,判断数组后面是否存在一样的树 /* Name:NYOJ-1278-Prototypes analyze Copyr ...