C++数组和指针的区别与联系

目录
  • 1 数组和指针的概念
  • 2 数组和指针的操作
    • 2.1 赋值
    • 2.2 存储
    • 2.3 大小
    • 2.4 初始化
  • 3 数组和指针的传参
    • 3.1 数组的传参
    • 3.2 指针的传参
  • 4 总结

前言:

一直以来,有很多地方在说到数组和指针时都会说数据就是指针,这种观点也被越来越多的人接受。本文将主要介绍数组和指针。是不是一样的大家自己理解。如此而已……

1 数组和指针的概念

数组:具有固定大小和连续内存空间的相同数据集合。里面的存储的元素具有地址连续性和数据类型相同的特点。
指针:是指存放内存地址的变量。从0开始。32位系统可访问内存4G,目前64位系统可寻址内存空间为128G。(可能会更大。这个需要硬件资源的支撑。不抬杠)

2 数组和指针的操作

2.1 赋值

数组:对数组元素进行逐个赋值。
指针:相同类型指针可以直接进行赋值。

2.2 存储

数组:从数组的定义就可以知道。数组的内存是连续的。可以在栈上进行定义也可以通过malloc或者new等在堆上进行定义。
指针:本身是一个变量,指向其对应的类型的变量。指向的地址也是变量的地址,然后在通过该地址获取它指向变量的值。

2.3 大小

可以通过sizeof宏进行获得。

数组:数组的大小通过sizeof(数组名)/sizeof(类型名)获取。
指针:在32位的操作系统中为4,在64位操作系统中是8。

2.4 初始化

数组的初始化方式为:

//初始化一个双精度型数组
double balance[5] = {1.0, 2.0, 3.0, 4.0, 5.0};
//初始化一个二维数组
int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };

指针的初始化方式为:

//定义一个指向整型变量的指针
int *p=new int(0) ;
//定义一个指向数组的指针
int *p=new int[n];
//定义一个指针的指针
int **pp=new (int*)[2]; 
pp[0]=new int[6];
pp[1]= new int[10];

指针数组和数组指针的定义请移步以下文章:C语言简明知识系列十一(下):指针

3 数组和指针的传参

C/C++的传参方式可以分为传值型和传址型,传值实际上对将参数进行拷贝,在程序运行中对参数做的任何修改都是在拷贝后的变量产生的,函数退出后不会影响传入参数,传址型恰恰相反,会对原有参数进行修改。数组和指针当做参数传入时基本为引用方式,具体要看代码作者是如何使用。

3.1 数组的传参

数组传参分为一维数组和多维数组。当做参数传入时会退化成指针。

一维数组:

void Fun(int a[])
{
    ;
}
int main()
{
   int testArray[]={1,2,3};
   Fun(testArray);
   return 0;
}

如上,当然也可以将Fun函数的参数形式定义为如下形式:

void Fun(int *a)
{
    ;
}

二维数组:

void Fun(int (*a)[5])
{
    ;
}
int main()
{
   int testArray[2][5]={
       {1,2,3,4,5},
       {4,5,6,7,8}
   };
   Fun(testArray);
   return 0;
}

3.2 指针的传参

如果函数的参数是一个指针。那么可以给函数传递的参数为三种,分别是:指针变量、变量的地址、一个数组名。在这里数组名实际上就是指向数组的首地址。
指针:

void Fun_p(int *p){};
int main()
{
   int testArray[]={1,2,3};
   int *pIntArray = testArray;
   int iValue = 10;
   //传递数组名
   Fun_p(testArray);
   //传递指针变量
   Fun_p(pIntArray);
   //变量地址
   Fun_p(&iValue);
   return 0;
}

指针的指针:

void Fun(int **p)
{
    ;
}

int main()
{
   int testArray[5]={1,2,3,4,5};
   int *pIntArray = testArray;
   int iValue = 10;
   int *tmpP = &iValue;
   //传递指针变量
   Fun(&pIntArray);
   //变量地址
   Fun(&tmpP);
   return 0;
}

4 总结

除了上面介绍外,指针还有函数指针,自然就会有指向函数的指针数组以及指向函数指针的指针。在实际使用时,这些类型的引入在指引我们灵活编程的同时也给我们带来了很大的风险,一旦出错,排除问题和解决问题的复杂度也将增加。在进行指针编程的时候需要谨慎使用。
函数和数组既有相同点,也有不各自独特之处。细思之,一些所谓函数既指针的说法需要谨慎判断。切勿人云亦云!

到此这篇关于C++数组和指针的区别与联系的文章就介绍到这了,更多相关C++数组和指针的区别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++中的数组引用和指针引用

    目录 C++中的数组引用和指针引用 一.引用的本质 二.数组的引用 三.指针的引用 C++中的数组引用和指针引用 一.引用的本质 我们在讲解引用之前需要知道为什么C++中会单独提出引用这个概念,在前面也提到在C++从一定角度上是C语言的升级版,其实引用时和C语言中的指针一样的功能,并且使得语法更加简洁.既然提到和指针功能相同,那么引用的功能其实就是给空间取别名. 代码解析: #define _CRT_SECURE_NO_WARNINGS #include<iostream> using nam

  • 浅谈C/C++中指针和数组的不同

    这边先简单介绍一下内存分区. 内存按照用途划分为五个区: 1.栈区:由系统控制分配和回收. 例如定义变量 int x = 0; int *p = NULL; 变量所占的内存都是分配在栈区的. 2.堆区:由程序员管理. 在C语言中由 malloc 申请的内存,或者在C++中,用 new 申请的内存,是在堆区中申请的.用完之后需要程序员自己回收,否则会造成内存泄漏. 3.全局区:存储全局变量及静态变量 4.常量区:存储常量. 5.代码区:存储编译之后的二进制代码. 数组和指针具有很大的相似性,实际上

  • 详解C++数组和数组名问题(指针、解引用)

    目录 一.指针 1.1 指针变量和普通变量的区别 1.2 为什么需要指针 1.3 指针使用三部曲 二.整形.浮点型数组 2.1 数组名其实是特殊的指针 2.2 理解复杂的数组的声明 2.3 数组名a.数组名取地址&a.数组首元素地址&a[0].指向数组首元素的指针*p 2.4 对数组名以及取值符&的理解 三.字符数组数组名 一.指针 1.1 指针变量和普通变量的区别 指针:指针的实质就是个变量,它跟普通变量没有任何本质区别.指针完整的应该叫指针变量,简称为指针. 是指向的意思.指针

  • C++数组指针和二维数组详情

    目录 1.二维数组 2.数组指针和二维数组 1.二维数组 对于一维数组,int arr[10]; arr是数组名,也是首元素的地址,&arr是数组的地址,那么对于二维数组 int arr[3][3], arr可以肯定是数组名,那么他是不是首元素的地址呢?如果是首元素的地址,那么arr[0]又该是什么呢?通过以下代码进行验证: #include <stdio.h> #define ROW 3 #define COLUMN 3 int main() { int arr[ROW][COLUM

  • 深入了解c++数组与指针

    1.数组 数组大小(元素个数)一般在编译时决定,也有少部分编译器可以运行时动态决定数组大小,比如icpc(Intel C++编译器). 1.1数组名的意义 数组名的本质是一个文字常量,代表数组第一个元素的地址和数组的首地址.数组名本身不是一个变量,不可以寻址,且不允许为数组名赋值.假设定义数组: int A[10]; 那么再定义一个引用: int* &r=A; 这是错误的写法,因为变量A是一个文字常量,不可寻址.如果要建立数组A的引用,应该这样定义: int* const &r=A; 此时

  • C++指针与数组:指针详解

    目录 一. What(什么是指针) 1. 地址初了解 2. 指针概念 3. 指针与指针变量 二. Why(为什么要有指针) 三. How(如何使用指针) 1. 基本定义 2. 取地址操作符 & 3. 解引用操作符 * 4. 结构体指针 5. 多级指针 6.指针变量的命名规范 四. 我对指针的一些理解 总结 本文主要介绍C语言中指针的基本概念与用法,本博文从零开始讲解指针,只要你了解基本的C语法,相信你看完本文后一定会有所收获. 一. What(什么是指针) 1. 地址初了解 要搞明白什么是指针,

  • C++数组和指针的区别与联系

    目录 1 数组和指针的概念 2 数组和指针的操作 2.1 赋值 2.2 存储 2.3 大小 2.4 初始化 3 数组和指针的传参 3.1 数组的传参 3.2 指针的传参 4 总结 前言: 一直以来,有很多地方在说到数组和指针时都会说数据就是指针,这种观点也被越来越多的人接受.本文将主要介绍数组和指针.是不是一样的大家自己理解.如此而已…… 1 数组和指针的概念 数组:具有固定大小和连续内存空间的相同数据集合.里面的存储的元素具有地址连续性和数据类型相同的特点.指针:是指存放内存地址的变量.从0开

  • 数组和指针的区别深入剖析

    在C/C++中,指针和数组在很多地方可以互换使用,这使得我们产生一种错觉,感觉数组和指针两者是完全等价的,事实上数组和指针是有很大的区别的. 1.两者在含义上的区别. 数组对应着一块内存区域,而指针是指向一块内存区域.其地址和容量在生命期里不会改变,只有数组的内容可以改变:而指针却不同,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错. 如: 复制代码 代码如下: #include<stdio.h> #include<stdli

  • C/C++ 数组和指针及引用的区别

    C/C++ 数组和指针及引用的区别 1.数组和指针的区别 (1)定义 数组是一个符号,不是变量,因而没有自己对应的存储空间.但是,指针是一个变量,里面存储的内容是另外一个变量的地址,因为是变量所以指针有自己的内存空间,只不过里面存储的内容比较特殊. (2)区别 a.对于声明和定义,指针和数组是不相同的,定义为数组,则声明也应该是数组,不可混淆 b.当作下标操作符时,指针和数组是等价的.a[i]会被编译器翻译成*(a+i). c.当数组声明被用作函数形参的时候,数组实际会被当作指针来使用. (3)

  • 简单分析C语言中指针数组与数组指针的区别

    首先来分别看一下,指针数组的一个小例子: #include <stdio.h> #include <string.h> int lookup_keyword(const char*key, const char* table[], const int size) { int ret = -1; int i = 0; for(i=0; i<size; i++) { if (strcmp(key, table[i]) == 0) { ret = i; break; } } ret

  • C语言中的数组和指针汇编代码分析实例

    今天看<程序员面试宝典>时偶然看到讲数组和指针的存取效率,闲着无聊,就自己写了段小代码,简单分析一下C语言背后的汇编,可能很多人只注重C语言,但在实际应用当中,当出现问题时,有时候还是通过分析汇编代码能够解决问题.本文只是为初学者,大牛可以飘过~ C源代码如下: 复制代码 代码如下: #include "stdafx.h" int main(int argc, char* argv[]) {        char a=1;        char c[] = "

  • 举例理解C语言二维数组的指针指向问题

    之前对数组的概念一直没有理解透彻,只觉得数组名就是个常量指针而已,用法和基本的指针差不多.所以当我尝试用二级指针去访问二维数组时,就经常会出错.下面就是刚开始写的一个错误的程序: #include <stdio.h> int main() { int iArray[2][3] = {{1,2,3},{4,5,6}}; int **pArray = NULL; pArray = iArray; printf("array[0][0] = %d\n", pArray[0][0]

  • php数组和链表的区别总结

    PHP中数组和链表的区别 从逻辑结构来看 1..数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况.当数据增加时,可能超出原先定义的元素个数:当数据减少时,造成内存浪费:数组可以根据下标直接存取. 2.链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入.删除数据项.(数组中插入.删除数据项时,需要移动其它数据项,非常繁琐)链表必须根据next指针找到下一个元素. 从内存存储来看 1.(静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小. 2.链表从

  • C语言的数组与指针你了解吗

    目录 前言 一.数组的定义 二.数组空间的初始化 1. char数组赋值 2.char数组硬件开发规范 二.数组与指针 总结 前言 自学笔记,没有历史知识铺垫(省略百度部分)C语言数组的概念及使用 一.数组的定义 char a[n]; 注意:数组与指针非常相似 二者的区别: 数组为常量,约定禁止二次赋值,即数组不应该出现在=左侧,如:a="HelloWorld";数组在声明时,会申请一段连续的内存空间,指针不会数组元素为变量,标记可以修改指向任意内存(实际上会copy右侧变量/常量到左

  • C语言数组和指针,内存之间的关系

    首先论证一维数组和一级指针之前的关系,我们常常使用一级指针指针的方式访问一维数组,只有对内存的理解到位才能理解它们直接的关系. 1.数组名是数组的首地址 2.对数组名取地址得到的还是数组的首地址 3.数组的访问方式其实就是首地址+偏移的寻址访问 我们在程序中会定义很多变量,有基本类型和自定义类型在进行开发的时候我对内存的访问访问就是通过变量名赋值的方式读写内存但是如果你看到的直接变量的符号名你将不可能理解内存.每一种类型都有字节宽度,char 1字节 short 2字节 int 字节float

随机推荐