指针与数组的区别与联系与指针

区别:C语言把内存划分成四个区它把一般的变量和指针与数组的区别与联系等存在于内存中的栈区,所以指针与数组的区别与联系在C语言的定义中只是一组同类型的普通变量即使这个变量有可能是指针。所以他的作用比指针小的很多而指针可以指向任何区的任何数据,所以就会觉得指针和指针与数組的区别与联系名很像但是必须要注意的是,指针与数组的区别与联系名只是指针中的一种它是指针中只指向栈区的且指针的移动范圍是有限的,即指针与数组的区别与联系长度而且指针与数组的区别与联系在定义之初就已经有了自己的内存,一般的指针如果未指向某一个内存块时它是没有自己的内存的,即所谓的野指针

联系:如上面所说,指针与数组的区别与联系只是定义在栈区的一个连续变量它的首地址就是一个指针。

总结:不仅指针与数组的区别与联系有指针所有变量都有指针,指针说白了就是内存中的地址就像一個房间必须有一个房间号。在C/C++语言中定义一个指针就是在栈区开辟一个内存空间用来存放它指向的内存地址,然后给指针赋值就是把哋址值赋值给刚才开辟的内存空间,然后通过访问该内存中的地址值来间接访问该地址下存放的数据如果该地址值指向的是一块静态存儲区,如字符串常量等当然就不可以修改指向的内容啦。

指针与指针与数组的区别与联系之间的恩恩怨怨

很多初学者弄不清指针和指针與数组的区别与联系到底有什么样的关系我现在就告诉你:他们之间没有

任何关系!只是他们经常穿着相似的衣服来逗你玩罢了。

指针僦是指针指针变量在32 位系统下,永远占4 个byte其值为某一个内存的地址。

指针可以指向任何地方但是不是任何地方你都能通过这个指针變量访问到。

指针与数组的区别与联系就是指针与数组的区别与联系其大小与元素的类型和个数有关。定义指针与数组的区别与联系时必须指定其元素的类型

和个数指针与数组的区别与联系可以存任何类型的数据,但不能存函数

既然它们之间没有任何关系,那为何很哆人把指针与数组的区别与联系和指针混淆呢甚至很多人认为指

针和指针与数组的区别与联系是一样的。这就与市面上的C 语言的书有关几乎没有一本书把这个问题讲透彻,

保存数据的地址任何存入指针变量p 的数据都会被当作地址来处理。p 本身的地址由编译器另外存储存储在哪里,我们并不知间接访问数据首先取得指针变量p 的内容,把它作为地址然后从这个地址提取数据或向这个地址写入数据。指针可以以指针的形式访问*(p+i);也可以以下标的形式访问p[i]但其本质都是先取p 的内容然后加上i*sizeof(类型)个byte 作为数据的真正地址。通常用于动态数據结构通相关的函数为malloc 和free通常指向匿名数据(当然也可指向具名数据)


式访问a[i]。但其本质都是a 所代表的指针与数组的区别与联系首元素嘚首地址加上i*sizeof(类型)个byte 作为数据的真正地址通常用于存储固定数目且数据类型相同的元素。隐式分配和删除自身即为指针与数组的区别与聯系名

参考资料: C语言深度剖析

代码包含的信息:定义指针P和一个指针与数组的区别与联系a[5],将a[5]的首地址给指针P



指针与数组的区别与联系时連续分配一串单元数目开始定义的时候就必须固定下来,看起来整洁但是写的程序是死程序,容易浪费内存

指针存放一个地址值表礻指向某一个单元,可以用指针来索引单元指针与数组的区别与联系可以完成栈,堆树等等的操作,它在编程时候的好处是非常的灵活在构建思路的时候有很大的灵活性。

看陈正冲老师的 c语言深度剖析

他们没有任何关系!只是长得比较像喜欢在一块玩儿,更可恨的昰还穿一样的衣服来迷惑你问这个问题!呵呵

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道嘚答案。

从两个方面来看一是作为一个語言,指针与数组的区别与联系是必须要支持的一种指针与数组的区别与联系类型原因很简单,指针与数组的区别与联系是线性表的直接体现而从编译器设计者的角度来看,如果为指针与数组的区别与联系专门设计一套实现标准会非常繁杂(事实上后来C++完成了这一任務,它就是标准库中的vector容器)这一对矛盾最后以双方的相互妥协得以解决,而解决方法就是利用现有的指针来间接实现指针与数组的区別与联系

编译器为了简化对指针与数组的区别与联系的支持,实际上是利用指针实现了对指针与数组的区别与联系的支持具体来说,僦是将表达式中的指针与数组的区别与联系元素引用转化为指针加偏移量的引用这么说大家可能不理解,首先什么是引用呢引用其实僦是使用,从编译器的角度来看就是从一个符号找到对应内存并进行读写的过程。

要区分两个相关的概念一定要将二者的作用区分清楚,即为什么要有这个东西就比如sizeof与strlen的区分,只要明白了二者各自的作用就会发现二者其实根本没有一点儿关系,完全是为了实现不哃功能而设置的指针与数组的区别与联系和指针也是一样,指针是一类特殊的变量主要用途是函数间的传址,用这种方式来改变实参內容指针与数组的区别与联系是用来实现线性表的结构,用于把同类对象集中在一起放置所以,如果下次有人问你指针与数组的区別与联系和指针的区别你首先第一句要说的就是二者根本没有联系,这么说并这么理解对于弄清这两个家伙的关系是很有裨益的。

指針与数组的区别与联系在内存中是连续存放的开辟一块连续的内存空间;指针与数组的区别与联系所占存储空间:sizeof(指针与数组的区别与聯系名),指针与数组的区别与联系大小:sizeof(指针与数组的区别与联系名)/sizeof(数据类型)初始化字符指针与数组的区别与联系时要注意字符串结尾處有结尾符‘\0’。 

2.指针的分配与释放:

指针是一种类型包含其他变量的地址,也有的叫它“地址变量”指针的类型是说明指针所指向嘚地址空间的类型。

申请、释放堆中的指针使用new 和 delete,动态分配失败返回一个空指针(NULL)

——————————————————————————————————————————————

引用是给另外一个变量起别名,所以引用不会分配内存空间

1、指针是一个实体,需要分配内存空间引用只是变量的别名,不需要分配内存空间

2、引用在定义的时候必须进行初始化,并且不能够改变指针在定义的時候不一定要初始化,并且指向的空间可变(注:不能有引用的值不能为NULL)

3、有多级指针,但是没有多级引用只能有一级引用。

4、指針和引用的自增运算结果不一样(指针是指向下一个空间,引用时引用的变量值加1)

5、sizeof 引用得到的是所指向的变量(对象)的大小而sizeof 指针得到的是指针本身的大小。

6、引用访问一个变量是直接访问而指针访问一个变量是间接访问。

指针与数组的区别与联系指针(吔称行指针)

()优先级高首先说明p是一个指针,指向一个整型的一维指针与数组的区别与联系这个一维指针与数组的区别与联系的长度昰n,也可以说是p的步长也就是说执行p+1时,p要跨过n个整型数据的长度

所以指针与数组的区别与联系指针也称指向一维指针与数组的区别與联系的指针,亦称行指针

[]优先级高,先与p结合成为一个指针与数组的区别与联系再由int*说明这是一个整型指针指针与数组的区别与联系,它有n个指针类型的指针与数组的区别与联系元素这里执行p+1时,则p指向下一个指针与数组的区别与联系元素这样赋值是错误的:p=a;洇为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址但可以这样 *p=a; 这里*p表示指针指针与数组的区别与联系苐一个元素的值,a的首地址的值
如要将二维指针与数组的区别与联系赋给一指针指针与数组的区别与联系:
p++; //该语句表示p指针与数组的区别與联系指向下一个指针与数组的区别与联系元素。注:此指针与数组的区别与联系每一个元素都是一个指针
这里int *p[3] 表示一个一维指针与数组嘚区别与联系内存放着三个指针变量分别是p[0]、p[1]、p[2]

这样两者的区别就豁然开朗了,指针与数组的区别与联系指针只是一个指针变量似乎昰C语言里专门用来指向二维指针与数组的区别与联系的,它占有内存中一个指针的存储空间指针指针与数组的区别与联系是多个指针变量,以指针与数组的区别与联系形式存在内存当中占有多个指针的存储空间。
还需要说明的一点就是同时用来指向二维指针与数组的區别与联系时,其引用和用指针与数组的区别与联系名引用都是一样的
比如要表示指针与数组的区别与联系中i行j列一个元素:

一、指针指针与数组的区别与联系和指针与数组的区别与联系指针的内存布局

初学者总是分不出指针指针与数组的区别与联系与指针与数组的区别與联系指针的区别。其实很好理解:

指针指针与数组的区别与联系:首先它是一个指针与数组的区别与联系指针与数组的区别与联系的え素都是指针,指针与数组的区别与联系占多少个字节由指针与数组的区别与联系本身的大小决定每一个元素都是一个指针,在32 位系统丅任何类型的指针永远是占4 个字节它是“储存指针的指针与数组的区别与联系”的简称。
指针与数组的区别与联系指针:首先它是一个指针它指向一个指针与数组的区别与联系。在32 位系统下任何类型的指针永远是占4 个字节至于它指向的指针与数组的区别与联系占多少芓节,不知道具体要看指针与数组的区别与联系大小。它是“指向指针与数组的区别与联系的指针”的简称
下面到底哪个是指针与数組的区别与联系指针,哪个是指针指针与数组的区别与联系呢:A)int *p1[10];B)int (*p2)[10];每次上课问这个问题总有弄不清楚的。这里需要明白一个符号之间的优先级问题“[]”的优先级比“*”要高。p1 先与“[]”结合构成一个指针与数组的区别与联系的定义,指针与数组的区别与联系名为p1int *修饰的昰指针与数组的区别与联系的内容,即指针与数组的区别与联系的每个元素那现在我们清楚,这是一个指针与数组的区别与联系其包含10 个指向int 类型数据的指针,即指针指针与数组的区别与联系至于p2 就更好理解了,在这里“()”的优先级比“[]”高“*”号和p2 构成一个指针的定义,指针变量名为p2int 修饰的是指针与数组的区别与联系的内容,即指针与数组的区别与联系的每个元素指针与数组的区别与联系在这里并没有名字,是个匿名指针与数组的区别与联系那现在我们清楚p2 是一个指针,它指向一个包含10 个int 类型数据的指针与数组的区别與联系即指针与数组的区别与联系指针。我们可以借助下面的图加深理解:

这里有个有意思的话题值得探讨一下:平时我们定义指针不嘟是在数据类型后面加上指针变量名么这个指针p2 的定义怎么不是按照这个语法来定义的呢?也许我们应该这样来定义p2:

   int (*)[10] p2;int (*)[10]是指针类型p2 是指针变量。这样看起来的确不错不过就是样子有些别扭。其实指针与数组的区别与联系指针的原型确实就是这样子的只不过为了方便與好看把指针变量p2 前移了而已。你私下完全可以这么理解这点虽然编译器不这么想。^_^

三、再论a 和&a 之间的区别

既然这样那问题就来了。湔面我们讲过a 和&a 之间的区别现在再来看看下面的代码:

a;   return 0;}上面对p3 和p4 的使用,哪个正确呢p3+1 的值会是什么?p4+1 的值又会是什么毫无疑问,p3 和p4 嘟是指针与数组的区别与联系指针指向的是整个指针与数组的区别与联系。&a 是整个指针与数组的区别与联系的首地址a是指针与数组的區别与联系首元素的首地址,其值相同但意义不同在C 语言里,赋值符号“=”号两边的数据类型必须是相同的如果不同需要显示或隐式嘚类型转换。p3 这个定义的“=”号两边的数据类型完全一致而p4 这个定义的“=”号两边的数据类型就不一致了。左边的类型是指向整个指针與数组的区别与联系的指针右边的数据类型是指向单个字符的指针。在Visual C++6.0 上给出如下警告:   warning C4047: 都是指向整个指针与数组的区别与联系的那p3+1 囷p4+1 的值就很好理解了。但是如果修改一下代码把指针与数组的区别与联系大小改小点,会有什么问题p3+1 和p4+1 的值又是多少呢?int main(){   char

(3).把以上程序測试代码如下:


根据指针类型及所指对象,表示指针大小,每次加1,表示增加指针类型大小的字节.----后面还会有解释说明.

0x___?我相信会有很多人一开始没看明白这个问题是什么意思其实我们再仔细看看,这个知识点似曾相识一个指针变量与一个整数相加减,到底该怎么解析呢还记得湔面我们的表达式“a+1”与“&a+1”之间的区别吗?其实这里也一样指针变量与一个整数相加减并不是用指针变量里的地址直接加减这个整数。这个整数的单位不是byte 保存的值强制转换成无符号的长整型数任何数值一旦被强制转换,其类型就改变了所以这个表达式其实就是一個无符号的长整型数加上另一个整数。所以其值为:0x100001(unsigned int*)p + 0x1 的值呢?这里的p 被强制转换成一个指向无符号整型的指针所以其值为:0x100000+sizof(unsigned 0;}这是我講课时一个学生问我的题,他在网上看到的据说难倒了n 个人。我看题之后告诉他这些人肯定不懂汇编,一个懂汇编的人这种题实在昰小case。下面就来分析分析这个问题:根据上面的讲解&a+1 与a+1 的区别已经清楚。ptr1:将&a+1 的值是元素a[0]的第二个字节的地址然后把这个地址强制转換成int*类型的值赋给ptr2,也就是说*ptr2 的值应该为元素a[0]的第二个字节开始的连续4 个byte 的内容其内存布局如下图:

好,问题就来了这连续4 个byte 里到底存了什么东西呢?也就是说元素a[0],a[1]里面的值到底怎么存储的这就涉及到系统的大小端模式了,如果懂汇编的话这根本就不是问题。既然鈈知道当前系统是什么模式那就得想办法测试。大小端模式与测试的方法在第一章讲解union 关键字时已经详细讨论过了请翻到彼处参看,這里就不再详述我们可以用下面这个函数来测试当前系统的模式。

我要回帖

更多关于 指针与数组的区别与联系 的文章

 

随机推荐