数组:

数组要么是在静态存储区上创建(如全局数组),要么是在栈上创建的。数组名代表着

段连续的内存,其地址和容量在生命周期内是不会改变的,而只能改变其数组内容。

指针:

指针是一种指针类型的变量,变量为一个内存的首地址,可以改变的,所以一般可以用指针

来指向动态开辟的内存。

下面以字符串为例来比较数组和指针:

1. 修改内容

char a[] = “ hello” ;
    a[0] = ‘ X’ ;
    cout << a << endl;//输出的是Xello
    char *p = “ world” ; // 注意 p 指向常量字符串
    p[0] = ‘ X’ ; // 编译器不能发现该错误//常量字符串的内容是不能被修改的。
    cout << p << endl;

2.内容复制与比较

不能对数组名进行直接复制与比较。若想把数组 a 的内容复制给数组 b,不能用语句 b = a ,否则将
产生编译错误。应该用标准库函数 strcpy 进行复制。同理,比较 b 和 a 的内容是否相同,不能用 if(b==a)
来判断,应该用标准库函数 strcmp 进行比较。
      a是一个数组名,p是一个指针语句 p = a 并不能把 a 的内容复制给指针 p,而是把 a 的地址赋给了 p。

要想复制 a 的内容,可以先用库函数 malloc 为 p 申请一块容量为 strlen(a)+1 个字符的内存,再用 strcpy

进行字符串复制。同理,语句if(p==a) 比较的不是内容而是地址,应该用库函数 strcmp 来比较。

3.计算内存容量

      用运算符 sizeof 可以计算出数组的容量(字节数)。如下示例中, sizeof(a)的值是 12(注意别忘了’’)。
指针 p 指向 a,但是 sizeof(p)的值却是 4。这是因为 sizeof(p)得到的是一个指针变量的字节数,相当于
sizeof(char*),而不是 p 所指的内存容量。 C++/C 语言没有办法知道指针所指的内存容量,除非在申请内
存时记住它。
       char a[] = "hello world";
       char *p = a;
       cout<< sizeof(a) << endl; // 12 字节
       cout<< sizeof(p) << endl; // 4 字节,表示的是一个字符指针占有的字节数
       注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。如下示例中,不论数组 a 的容
量是多少, sizeof(a)始终等于 sizeof(char *)。
void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是 100 字节
}

 

指针与数组的对比(——选自:C++内存管理技术内幕)的更多相关文章

  1. C++内存分配方式(——选自:C++内存管理技术内幕)

    C++内存分配的区: 1.栈:程序运行时分配的,局部变量,以及传入的参数等存储的地方,在程序结束的时候会回收 2.堆:new分配,由delete释放 3.自由存储区:malloc分配 4.全局/静态存 ...

  2. c指针与数组,传参问题,指针数组与数组指针的区别,二维数组动态内存分配

    一 数组的结构:顺序存储,看谭浩强中的图,牢记 1.数组名指代一种数据结构:数组 现在可以解释为什么第1个程序第6行的输出为10的问题,根据结论1,数组名str的内涵为一种数据结构,即一个长度为10的 ...

  3. C语言指针和数组知识总结(上)

    C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是:  %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...

  4. go语言之字符串、指针、数组、切片、结构struct、面向对象

    一: 字符串 概述: Go 语言将字符串作为 种原生的基本数据类型,字 符串的初始化可以使用字符串字面量. (1)字符串是常量,可以通过类 数组 索引访问其字节单元,但是不能修改某个字节的值 (2)宇 ...

  5. C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用

    类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...

  6. c/c++ 函数、常量、指针和数组的关系梳理

    压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和 ...

  7. 11-C语言指针&一维数组&字符串

    一.用指针遍历数组元素 1.最普通的遍历方式是用数组下标来遍历元素 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3 4 int i; 5 for (i = ...

  8. 指针与数组的区别 —— 《C语言深度剖析》读书心得

    原书很多已经写的很清楚很精炼了,我也无谓做无意义的搬运,仅把一些基础和一些我自己以前容易搞混的地方写一下. 1. 意义: 指针: 指针也是一种类型,长度为4字节,其存放的内容只能是一个地址(4字节). ...

  9. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

随机推荐

  1. Android SlidingTabLayout的使用--替代ActionBar的Tab导航

    最近在使用ActionBar的时候,如果使用的是最新版V7包或者最新的SDK平台,就会发现 ActionBar的导航功能已经不建议使用了.主要的原因是ActionBar自带Tab导航自定义性差(只能通 ...

  2. 【数据分析 R语言实战】学习笔记 第五章 数据的描述性分析(下)

    5.6 多组数据分析及R实现 5.6.1 多组数据的统计分析 > group=read.csv("C:/Program Files/RStudio/002582.csv") ...

  3. linux下查看nginx配置文件地址

    which nginx/usr/sbin/nginx -t

  4. UI常用字体定义和继承的实例,ResearchKitCode

    #import <UIKit/UIKit.h> @interface UIFont (APCAppearance) + (UIFont*) appRegularFontWithSize: ...

  5. 中间件及tomcat的内存溢出调优

    主要是这三个选项的调整需要根据主机的内存配置 以及业务量的使用情况调节 -Xmx4g -Xms4g -Xmn2g xmx 与xms一般设置为一样 xmn大致设置为xmx xms的三分之一   可以使用 ...

  6. easyui权限管理

    在easyui上实现权限的管理 所谓权限:指的是系统中的资源,资源包括菜单资源(学习情况报表,账号审核...)以及按钮资源所谓角色:指的是系统中的权限集合(每一个角色对应着哪些权限集合) 1.一星权限 ...

  7. chrome ubuntu启动不了

    安装好后,点击图标没反应 用命令行运行chrome并显示log:google-chrome --enable-logging=stderr --log-level=4 报错如下: 解决:安装更高版本的 ...

  8. sqlserver 分页问题

    1.top 主要是在sql server 2000中使用,效率较差 2.row_number函数 这种方法是sql server 2005以后,支持了row_number函数后,才开始使用的. dec ...

  9. 单片微机原理P1:80C51指令系统和编程方法

    0. 寻址方式 寻址方式在汇编中是很重要的,汇编所有的操作都是和和内存或者寄存器打交道的,在80C51里面一共7种寻址方式.   1. 立即寻址: 这个没什么好说的,就是往寄存器或者内存里面写立即数, ...

  10. 0xC00000FD: Stack overflow (parameters: 0x00000000, 0x003E2000).错误

    这个错误是“栈溢出”,每个线程的栈空间默认是1MB,局部变量(非静态)都在栈中分配,当使用的局部变量所需空间过多时,就会溢出.你检查一下程序,看看哪些函数中定义了大数组,把大数组改成用new分配,函数 ...