数组和指针的区别
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数组或是在静态存储区被创建(全局数 组),或是在栈上被创建。数组名对应着,注 意不是指向,一块内存,其地址与容量在生命 期内保持不变(当然,使用了realloc()的不 算),只有数组的内容可以改变。 指针可以随时指向任意类型的内存块,它 的特征是“可变”,所以我们常用指针来操作动 态内存。指针远比数组灵活,当然也就更危险。
a. 将数组名直接赋值给指针,数组名转换为指 向数组的首单元的常量指针。 b.直接将数组名作为指针形参的时候,数组名 则转换为指向数组的首单元的常量指针进行传 递,如下程序2: void fun(char str[]) 。。。 char Leabharlann Baidutr1[5]; fun(str1);
数组名作为函数形参进行传递时,在子函数体
char str[7]=”ksarea”; char *pstr=str; cout<< str[3]<<pstr[3]<<endl; 其中str[3]和pstr[3]返回的都是字符‟r„,但是编译 器产生的执行代码却不一样。对于str[3],执行代 码是从str开始,向后移动三个字节,然后取出其中 的字符;而对于pstr[3],执行代码是从pstr中取出 地址,然后在其上加3,然后取出对应内存中的字 符。当然,如果pstr是指向int型的指针,那么 pstr[3]的处理过程是从pstr中取出地址,然后在其 上加上3*sizeof(int),最后取出对应内存中的字符, 其他的数据类型一次类推。
char
str[10]; char *pstr=str; cout<<sizeof(str); cout<<sizeof(pstr); 第一行输出结果是:10,第二行输出结果是: 4
数组名对应着(而不是指向)一块内存(数组
所占的内存区域)或者说是指代数组这种数据 结构,其地址与容量在生命期内保持不变,只 有数组的内容可以改变。指针对应着一个占据4 个字节(Win32)的内存区域,而指向这4个字 节所存储的地址所对应的内存单元,它可以指 向任意类型的内存块。因此,sizeof(str)值为数 组占据的内存空间大小即10个字节,而 sizeof(pstr)值为指针的值占据的内存空间大小 即4个字节。
用运算符sizeof可以计算出数组的容量(字 节数)。(包括最后面的'\0')。指针p指向a, 但是sizeof(p)的值却是4。这是因为sizeof(p)得 到的是一个指针变量的字节数,相当于 sizeof(char*),而不是p所指的内存容量 siziof(char[6])。C++/C不能知道指针所指的内 存容量。 值得注意的是,当数组作为函数的参数进 行传递时,数组就自动退化为同类型的指针。 那么不论数组a的容量是多少,sizeof(a)始终等 于sizeof(char *)。
内,它已经不再是一个指针常量,而是变成一 个真正的指针,可以进行增减等操作,可以被 修改。所以程序2中子程序第一条语句输出的 sizeof(str)的值为4.
既然数组名可以被看作指针常量,而常量是不
能修改的,那么如下代码是不允许的: char str[10]; str++; 但如下代码则合法的: char str[10]; char *pstr=str; pstr++;