C++中数组名和指针的区别联系
原文:http://www.cnblogs.com/ddx-deng/archive/2012/12/16/3755862.html
第一个结论:
#include "iostream.h"
void main()
{
1、 char str[]="abcdef";
2、int n[]={1,2,3,4,5};
3、char *p=str;//
4、 cout<<sizeof(str)<<endl;一个字母在内存中占一个字节,这里输出7,7个字节但是6个字母,原因是字符串后面有一个‘\0’结束符,也占一个字节
5、cout<<sizeof(n)<<endl;一个int数据在内存中占用4个字节,输出4*5=20
6、cout<<sizeof(p)<<endl;输出4
7、p++;
8、str++;
}
7
20
4
看似指针和数组名是相同的,其实不然;第4行和第6行输出结果不同就是证明,前者是字符数组长度7,而指针在32位机中是一个DWORD,4个字节,在64位中就是8了。
第二个结论:
第8句存在的话会编译报错,也就是数组名不能自加和自减,而指针可以。
(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;//************这才是实质
(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;//********code
(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!//********code
第三个结论:数组名失去原本内含,沦为指针。可以做自增自减操作。
#include "iostream.h"
void Fun(char str[]);
void main()
{
1、 char s[6];
2、 Fun(s);
}
void Fun(char str[])
{
cout<<sizeof(str)<<endl;
}
第2句的结果不再是6,而是指针大小4.
分析一个别人提问的例子:
#include "iostream.h"
void main()
{
int a[]={1,2,3,4,5};
int *ptr=(int *)(&a+1);//&a是不是取地址,还是引用?
cout<<*(ptr-1)<<endl;
cout<<*(ptr)<<endl;
}
最终输出结果:5.
解释1:a是一个数组名,上面说的,数组是一个数据结构;并且a已经能代表数据结构(本数组)的地址了,于是&a是对数据结构取地址,取得的地址+1会怎么样?会指向下一个数据结构,但是这里只有一个数据结构。。。那么int *ptr=(int *)(&a+1);执行后ptr指向数据结构(int[5]的数组)的结束,a是数组,&a 就是指向数组的指针,&a+1所以位移5个int,*(ptr-1)又是int* 反位移1个,5-1=4,位移4位就是第五个数
解释2:a是一个int[5]类型,所以&a+1就会到数组末尾,再减1就是5的位置
C++中数组名和指针的区别联系的更多相关文章
- 【转】C语言中数组名和指针的区别
注:本文转自http://www.cnblogs.com/furaibo/archive/2010/03/19/1689710.html 魔幻数组名 请看程序(本文程序在WIN32平台下编译): #i ...
- 别人不会给你说的---C语言中数组名和指针的区别 及 sizeof用法
引自: http://blog.csdn.net/tianyue168/article/details/5781924 #i nclude <iostream.h> int main( ...
- C/C++数组名与指针的区别详解
1.数组名不是指针我们看下面的示例: #include <iostream> int main() { ]; char *pStr = str; cout << sizeof( ...
- 对于C语言中数组名是指针的理解
我们都知道,c语言中数组名是一个指针,比如下面这段代码 #include<iostream>using namespace std;int main(){ int a[4]={1,2,3, ...
- CPP-基础:C/C++数组名与指针的区别
2005-08-23 08:36 来源:天极网 作者:宋宝华 责任编辑:方舟·yesky 引言 指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很 ...
- c语言中数组名和指针变量的区别
编译器工作原理:在64位的计算机中,当创建一个指针变量时,计算机会为它分配8个字节的存储空间.但如果创建的是数组呢?计算机会为数组分配存储空间,但不会为数组变量分配任何空间,编译器仅在出现它的地方把它 ...
- C/C++——C语言数组名与指针
版权声明:原创文章,转载请注明出处. 1. 一维数组名与指针 对于一维数组来说,数组名就是指向该数组首地址的指针,对于: ]; array就是该数组的首地址,如果我们想定义一个指向该数组的指针,我们可 ...
- C/C++数组名与指针区别深入探索(转载)
转载自: C/C++数组名与指针区别深入探索 引言 指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.而许多的大学老师, ...
- c/c++数组名和指针区别深入探索
指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:&quo ...
随机推荐
- 记录今天客户的SQLSERVER启动不起来( 错误9003)的解决过程2013-11-26
记录今天客户的SQLSERVER启动不起来( 错误9003)的解决过程2013-11-26 今天一大早上班就接到客户的电话,说:SQLSERVER启动不起来,业务系统使用不了 于是我就使用QQ远程,帮 ...
- HBase Scan流程分析
HBase Scan流程分析 HBase的读流程目前看来比较复杂,主要由于: HBase的表数据分为多个层次,HRegion->HStore->[HFile,HFile,...,MemSt ...
- hdfs操作手册
hdfscli 命令行 # hdfscli --help HdfsCLI: a command line interface for HDFS. Usage: hdfscli [interactive ...
- SQLServer SELECT @@IDENTITY 遇到的坑
经常在写存储过程的时候获取当前插入后的ID都会用 @@IDENTITY 但是今天在用 @@IDENTITY的时候涉及到当前数据的插入会有insert触发器发生时,发现与实际插入的ID值对不上,网上查 ...
- 查找数据库表中重复的 Image 类型值
直接上代码: SELECT * FROM [dbo].[V_Courseware] ))) IN ())) FROM [dbo].[V_Courseware] ))) ); 替换以上代码中相应对象即可 ...
- November 6th 2016 Week 46th Sunday
The starting point of all achievements is desire. 成功的第一步是渴望. Those who make great achievements are o ...
- 解析JS运动
解析JS运动 物体运动原理:通过改变物体的位置,而发生移动变化. 任何运动都是相对的,就像物理中的运动公式:s(要达到的)=s0(当前的样式值)+vt. 方法: 1.运动的物体使用绝对定位 ...
- 8年前,令我窒息的Java socket体验学习
本来已经放弃编程了,那时我发誓再也不去IT培训班了,如果找不到工作,我就去工地上打工.可心有不甘,老是惦记着,我不想天天面对生产线,做一个丧失思考能力的操作工,可后来呀,还是走上了程序员之路...这么 ...
- 初探tp
现在对前端的要求越来越高了 基本上身为一个前端人员需要会一种后台语言,于是选择了当下流行的php.因为是自学对我这个不怎么懂代码的人来说还是有点难度的. 1.先看看thinkphp的目录结构 1 ├ ...
- BZOJ3160:万径人踪灭(FFT,Manacher)
Solution $ans=$回文子序列$-$回文子串的数目. 后者可以用$manacher$直接求. 前者设$f[i]$表示以$i$为中心的对称的字母对数. 那么回文子序列的数量也就是$\sum_{ ...