指针和数组区别.doc_第1页
指针和数组区别.doc_第2页
指针和数组区别.doc_第3页
指针和数组区别.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

对于c语言的学习,一直处于表面、基础以及混沌的状态。进入了计算机学院后,为了避免编程过程中浪费一些不必要的时间去查错、去优化程序,深深觉得应该从现在起一点一滴踏踏实实的站在巨人的肩膀上进行总结、学习。希望和大家分享自己的学习过程,可能有的东西写的比较幼稚哈哈没事主要是学习!第一篇 数组与指针的部分区别1、首先对于编译器而言,一个数组是一个地址,一个指针是一个地址的地址。数组中保存数据,指针保存地址;利用数组直接访问数据,利用指针间接的访问数据(先取得指针的内容,然后以它为地址,取得数据)具体解释如下:char a = abcdefg;-1char *p = abcdefg;-2上面的a和p有什么区别呢?首先看下计算机中对变量是如何存储的。从编译原理中我们知道,对于所有的变量他都会影射到一个符号表中。为了简化,这里给出一种最简单的便于理解的符号表:a0xffaap0xffcc表1 一个简单的符号表示例以上表格中a代表一个变量,0xffaa则为变量a的内容的存储地址;p代表另一个变量,0xffcc为变量p的内容的存储地址。对于数组型的变量和指针型的变量,其地址代表的含义不同。 对于数组a:这个0xffaa地址就是其存放数组内容的首地址了。对于ai的引用步骤如下:l 步骤一、取出i的值,将他与0xffaa相加;l 步骤二、取出为(0xffaa+i)中的内容。 对于指针p:这个0xffcc地址就是中存放的不是字符串的内容,而是一个地址,这个地址才是字符串的首地址,对pi或者用指针表示*(p+i)的应用步骤如下:l 步骤一、取出0xffcc地址中的内容,例如为0xffdf;l 步骤二、取出地址0xffdf中的内容。下面是在VC6.0下作的一个试验,通过这个试验大家可以看到,虽然同过和通过*引用都一样,但在内部处理的方法是不一样的。#include stdafx.h#include stdio.hint main(int argc, char* argv) int a3=1,2,3; int *p =a; printf(a:%d,&a:%d,a0:%d,*a:%d,p:%d,&p:%d,*p:%d,p0:%d,a,&a,a0,*a,p,&p,*p,p0); return 0;输出结果:a:1310580,&a:1310580,a0:1,*a:1,p:1310580,&p:1310576,*p:1,p0:1。通过下面的也可以直观的对其了解:注意:a=0xD2D61000 在符号表中,为一常量,并不占用内存空间。&a应该是没有意义,在vc6下,&a=a=0xD2D61000 b=0xD2D61000 在内存中,为一变量,占用4个字节,&b=0xD2D60080注意:hello不是常量字符串,是可被修改的。2、内存分配方式不同数组通常用于存储固定数目数据类型相同的元素,主要在栈中分配内存;指针通常用于动态数据结构,一般在堆上对数据进行动态分配。数组内存使用后,由编译器自动释放;指针动态分配后需要自行释放。栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。上述两点大额区别可以用下表来表示:表2 指针与数组的区别指针数组保存数据的地址保存数据间接访问数据直接访问通常用于动态数据结构通常用于存储固定数目数据类型相同的元素相关操作malloc(),free()等隐式分配和删除3、 数组与指针本身和内容是否可修改不同数组名对应着(而不是指向)一块内存,声明一个数组时,编译器会根据数组中元素的个数为其分配空间,其地址与容量在生命期内保持不变。数组名存放在符号表中,该值为数组的起始地址,为常量,不能被修改,数组的内容可以改变!初始化指针是所创建的字符串时常量,被定义为只读。指针它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容(字符串的值)是不可以被修改的,如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。例如:int main(int argc, char* argv)char a = abcdefg; /-数组内容能修改(字符数组),数组名本身不能改变char *p = acd;/-内容不能修改(字符串常量),但指针p可以+或- 变化a+; / 编译时报错p+; /正确a1 = g;/正确*p+ = g;/编译不报错,但执行时出现内存不能写的错误 return 0;4、内容的复制和比较不能对数组进行字节复制和比较,对于两个数组a,b,不能用b=a进行复制,而应当使用标准库函数strcpy()。也不能使用if(b=a)进行比较,应当使用strcmp()。而对于指针p,如果要想将数组a中的内容复制,要先申请一块内存区域,然后使用strcpy()进行拷贝。void main(void ) char a =hello;char b10;strcpy(b,a); / cant use b=a;if(strcmp(b,a) = 0);/cant use if(b=a)char *p = NULL;p = (char *)malloc(sizeof(char *)*(strlen(a)+1);strcpy(p, a);if(strcmp(b,a) = 0);5、计算内存容量用运算符sizeof()可以计算出数组的容量(字节数)。如下例char a = abcdef;char *p = a;sizeof(a) = 7;sizeof(p) = 4;/sizeof(p) equal to sizeof(char *) =4注意注

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论