(C/C++)区别:数组与指针,指针与引用
1.数组跟指针的区别
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。
数组和指针特点的简单比较:
| 数组 | 指针 |
| 保存数据 | 保存地址 |
| 直接访问数据 | 间接访问数据,先取得指针的内容,然后以它为地址取得数据 |
| 用于存储数目固定且类型相同的数据 | 通常用于动态数据结构 |
| 编译器自动分配和删除 | 动态的分配和删除 |
| 自身即为数据名 | 通常指向隐式数据 |
(1)指针和数组都可以在初始化的时候赋予字符串常量。尽管看上去一样,底层机制却不同。
指针在定义的时候,编译器并不会为指针所指向的对象分配内存空间,它只是分配指针变量的空间。除非以一个字符串常量对其进行初始化。下面的定义创建了一个字符串常量(为其分配了内存空间) char *p = "abcd";
在ANSI C中,初始化指针时所指向的字符串被定义为只读,如果想通过指针修改字符串的时候,会产生未定义的行为。 数组也可以用字符串常量进行初始化,但是其内容可以被修改。
(2)内容的复制和比较不能对数组进行字节复制和比较,对于两个数组a,b,不能用b=a进行复制,而应当使用标准库函数strcpy()。也不能使用if(b==a)进行比较,应当使用strcmp()。 而对于指针p,如果要想将数组a中的内容复制,要先申请一块内存区域,然后使用strcpy()进行拷贝。
void main(void ) {
char a[] ="hello";
char b[10];
strcpy(b,a); // can't use b=a;
if(strcmp(b,a) == 0);//can't use if(b==a)
char *p = NULL;
p = (char *)malloc(sizeof(char )*(strlen(a)+1);
strcpy(p, a);
if(strcmp(b,a) == 0);
}
(3)计算内存容量
用运算符sizeof()可以计算出数组的容量(字节数)。如下例
char a[] = "abcdef";
char *p = a;
sizeof(a) = 7;
sizeof(p) = 4;//sizeof(p) equal to sizeof(char *) =4
注意当数组名作为函数参数进行传递时,该数组自动退化该类型的指针,如下例:
void TEST(char a[100])
{
cout<<sizeof(a)<<endl;// in this place, sizeof(a) is equal to sizeof(char *) = 4
}
附:数组指针与指针数组
指针数组:首先它是一个数组,数组的元素都是指针,它的元素可以指向相同类型的不同对象,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。
数组指针:首先它是一个指针,它指向一个数组。在32 位系统下永远是占4个字节,至于它指向的数组占多少字节,不知道。它是“指向数组的指针”的简称。
可参考:C语言指针数组和数组指针
函数指针与指针函数
函数指针就是指向函数的存储空间地址的指针,可以对函数指针进行赋值并且通过函数指针来调用函数,它的本质是一个指针。
而指针函数只是说明它是一个返回值为指针的函数,其本质是一个函数。
2.指针和引用的区别
(C/C++)区别:数组与指针,指针与引用的更多相关文章
- C/C++——C语言数组名与指针
版权声明:原创文章,转载请注明出处. 1. 一维数组名与指针 对于一维数组来说,数组名就是指向该数组首地址的指针,对于: ]; array就是该数组的首地址,如果我们想定义一个指向该数组的指针,我们可 ...
- char[]数组与char *指针的区别
char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了 ...
- 别人不会给你说的---C语言中数组名和指针的区别 及 sizeof用法
引自: http://blog.csdn.net/tianyue168/article/details/5781924 #i nclude <iostream.h> int main( ...
- C/C++数组名与指针区别深入探索(转载)
转载自: C/C++数组名与指针区别深入探索 引言 指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.而许多的大学老师, ...
- C/C++数组名与指针的区别详解
1.数组名不是指针我们看下面的示例: #include <iostream> int main() { ]; char *pStr = str; cout << sizeof( ...
- c/c++数组名和指针区别深入探索
指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:&quo ...
- CPP-基础:C/C++数组名与指针的区别
2005-08-23 08:36 来源:天极网 作者:宋宝华 责任编辑:方舟·yesky 引言 指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很 ...
- 【转】C语言中数组名和指针的区别
注:本文转自http://www.cnblogs.com/furaibo/archive/2010/03/19/1689710.html 魔幻数组名 请看程序(本文程序在WIN32平台下编译): #i ...
- C语言数组操作和指针操作谁更高效
在上一篇博文 代码优化小技巧(持续更新......) 第三条关于数组和指针谁更高效, 意犹未尽, 决定单独拉出一篇来讲 1. 数组和指针操作对比 #include <stdio.h> i ...
- [ 随手记 2 ] C/C++ 数组/指针/传数组到函数/指针数组/数组指针
1.=================================================================== 1,数组是一块内存连续的数据.2,指针是一个指向内存空间的变 ...
随机推荐
- 【ZJOI2017】仙人掌
[ZJOI2017]仙人掌 参考博客:https://www.cnblogs.com/wfj2048/p/6636028.html 我们先求出\(dfs\)树(就是\(dfs\)一遍),然后问题就变成 ...
- C#进阶のMEF注入
1.什么是MEF 先来看msdn上面的解释:MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库发现并使用扩展, ...
- 在 Linux 中自动配置 IPv6 地址
在 Linux 中自动配置 IPv6 地址 在本文中,我们将学习如何为 ULA 自动配置 IP 地址. 何时使用唯一本地地址 唯一本地地址unique local addresses(ULA)使用 f ...
- Linux分区的几种方案
通用方法/boot 引导分区 200M swap 交换分区 内存的1.5倍(内存小于8G) 大于8G 给8G/ 根分区 剩下多少给多少 数据非常重要/bootswap/ 50-200G/data 剩下 ...
- OAuth2基本概念和运作流程
OAuth(开放授权)是一个关于授权的开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用.目前的版本是2.0版,本文 ...
- RSA简介
RSA概述 首先看这个加密算法的命名.很有意思,它其实是三个人的名字.早在1977年由麻省理工学院的三位数学家Rivest.Shamir 和 Adleman一起提出了这个加密算法,并且用他们三个人姓氏 ...
- php 依赖注入的实现
当A类需要依赖于B类,也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合.这个时候解决方式是,A类应该去依赖B类的 ...
- glance系列一:glance基础
一 什么是glance glance即image service,是为虚拟机的创建提供镜像的服务 二 为何要有glance 我们基于openstack是构建基本的Iaas平台对外提供虚拟机,而虚拟机在 ...
- Jenkins Pipeline高级用法-ShareLibrary
1.Github配置 1.1 上传jenkinsfile到github https://github.com/zeyangli/ShareLibrary-jenkins.git 2.Jenkins配置 ...
- BZOJ1390 CEOI2008 Fences 凸包、Floyd最小环/DP
传送门 为了方便描述把固定点叫做白色点,Tree叫做黑色点 一种基于特殊性质的做法: 如果不算入选白色的权值,那么一定会选中所有白色点构成的凸包上的点,因为能够尽可能围更多的黑色点.然后我们在这个基础 ...