(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,指针是一个指向内存空间的变 ...
随机推荐
- (4)Python列表list
- 给定一个正整数n,返回从1到n构成的所有的BST
public class C3 { public static void main(String[] args) { ArrayList<TreeNode> res = generateT ...
- vue自定义指令用法总结及案例
1.vue中的指令有哪些?
- Mybatis基础核心类说明
1: org.apache.ibatis.mapping.ParameterMapping 为Mybatis参数的抽象表示,包括Java类型与数据库类型以及类型处理器属性名字等等!! 例如: 其中i ...
- 【编辑器】Visual Studio Code
1.官网:https://code.visualstudio.com/Download 2.插件:https://marketplace.visualstudio.com/VSCode https:/ ...
- 【vue】在移动端使用better-scroll 实现滚动效果
安装依赖:(c)npm install better-scroll --save 引入: import BScroll from 'better-scroll' 格式: var obj = new B ...
- Consul在.Net Core中初体验
Consul在.Net Core中初体验 简介 在阅读本文前我想您应该对微服务架构有一个基本的或者模糊的了解 Consul是一个服务管理软件,它其实有很多组件,包括服务发现配置共享键值对存储等 本文主 ...
- 初学Python——文件操作第二篇
前言:为什么需要第二篇文件操作?因为第一篇的知识根本不足以支撑基本的需求.下面来一一分析. 一.Python文件操作的特点 首先来类比一下,作为高级编程语言的始祖,C语言如何对文件进行操作? 字符(串 ...
- linux内存源码分析 - 伙伴系统(释放页框)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 翻了一下之前的文章,发现竟然忘记写内核是如何释放页框的,罪过. 释放页框很简单,其实只有几步 检查此页是否被其他 ...
- java 基础03 继承