C++数组和指针的区别? c++里,数组的指针和普通的指针有什么区别?

作者&投稿:尘叶 (若有异议请与网页底部的电邮联系)
C++/C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。

指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。

修改内容时,设字符数组a的容量是6个字符,其内容为hello\0。a的内容可以改变,如a[0]= ‘X’。指针p指向常量字符串“world”(位于静态存储区,内容为world\0),常量字符串的内容是不可以被修改的。从语法上看,编译器并不觉得语句p[0]= ‘X’有什么不妥,但是该语句企图修改常量字符串的内容而导致运行错误。

不能对数组名进行直接复制与比较。想把数组a的内容复制给数组b,不能用语句 b = a ,否则将产生编译错误。应该用标准库函数strcpy进行复制。同理,比较b和a的内容是否相同,不能用if(b==a) 来判断,应该用标准库函数strcmp进行比较。对于指针,语句p = a 并不能把a的内容复制指针p,而是把a的地址赋给了p。要想复制a的内容,可以先用库函数malloc为p申请一块容量为strlen(a)+1个字符的内存,再用strcpy进行字符串复制。同理,语句if(p==a) 比较的不是内容而是地址,应该用库函数strcmp来比较。

用运算符sizeof可以计算出数组的容量(字节数)。设指针p指向a,但是sizeof(p)的值却是4。这是因为sizeof(p)得到的是一个指针变量的字节数,相当于sizeof(char*),而不是p所指的内存容量。C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。

注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

C++数组和指针的区别详解~

第一个结论:
#include "iostream.h"
void main()
{
1、 char str[]="abcdef";
2、int n[]={1,2,3,4,5};
3、char *p=str;//
4、 cout<<sizeof(str)<<endl;一个字母在内存中占一个字节,这里输出7,7个字节但是6个字母,原因是字符串后面有一个‘\0’结束符,也占一个字节
5、cout<<sizeof(n)<<endl;一个int数据在内存中占用4个字节,输出4*5=20
6、cout<<sizeof(p)<<endl;输出4
7、p++;
8、str++;
}
7
20
4
看似指针和数组名是相同的,其实不然;第4行和第6行输出结果不同就是证明,前者是字符数组长度7,而指针在32位机中是一个DWORD,4个字节,在64位中就是8了。
第二个结论:
第8句存在的话会编译报错,也就是数组名不能自加和自减,而指针可以。
(1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;//************这才是实质

(2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;//********code

(3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!//********code


第三个结论:数组名失去原本内含,沦为指针。可以做自增自减操作。
#include "iostream.h"
void Fun(char str[]);
void main()
{
1、 char s[6];
2、 Fun(s);
}
void Fun(char str[])
{
cout<<sizeof(str)<<endl;
}
第2句的结果不再是6,而是指针大小4.

分析一个别人提问的例子:
#include "iostream.h"
void main()
{
int a[]={1,2,3,4,5};
int *ptr=(int *)(&a+1);//&a是不是取地址,还是引用?
cout<<*(ptr-1)<<endl;
cout<<*(ptr)<<endl;
}
最终输出结果:5.
解释1:a是一个数组名,上面说的,数组是一个数据结构;并且a已经能代表数据结构(本数组)的地址了,于是&a是对数据结构取地址,取得的地址+1会怎么样?会指向下一个数据结构,但是这里只有一个数据结构。。。那么int *ptr=(int *)(&a+1);执行后ptr指向数据结构(int[5]的数组)的结束,a是数组,&a 就是指向数组的指针,&a+1所以位移5个int,*(ptr-1)又是int* 反位移1个,5-1=4,位移4位就是第五个数

解释2:a是一个int[5]类型,所以&a+1就会到数组末尾,再减1就是5的位置

cmp函数里的sizeof(a)和sizeof(b)应该是得不到你想要的结果的。
如果比较的数组是字符类型的话,数组的长度可以由strlen函数得到。

关于二维数组和一维指针数组的区别
答:不同的地方:a[1] -- 如果一组10个,这个表示的第1(0开始)组的开始地址。a[1]和&a[1][0]相同。而b[1]就是第1个数。说道一维指针数组,int* d[10], 本质上和int b[10]没有区别,b里边存了10个int值,而d里边存了10个int地址。地址也是值,只是我们通常不直接用这个地址,而是用...

请问c语言中行指针和指针数组有什么区别吗?行指针有什么用吗?
答:数组指针就是一个数组的地址,行指针出现在二维数组里就是是二级指针那里附近,例如 int a[10][5];那么二维数组可以可分为行和列,那么要找到每一个数组就要通过哪行和哪列查找,a[10][10]中第一个小标表示行,第二个下标表示列,那么 a[1],a[2]表示对应行的指针,记得在二维数组中约定a[...

二维数组与指针的指针有何区别
答:最大的区别是数组不能被直接赋值,比如二维数组a[3][3],b[3],你不能这样赋值:a[0]=b;但指针可以。其次,就像一楼说的,数组一开始就被分配特定空间,指针值赋予一个地址。最后,数组分配的是一段连续的空间,int a[3][3]则a[0][0],a[0][1],a[0][2],a[1][0]...a[2][2...

指针数组和指针是一样的吗?
答:正确的。数组指针是指向数组地址的指针,其本质为指针;指针数组是数组元素为指针的数组(例如 int *p[4],定义了p[0],p[1],p[2],p[3]三个指针),其本质为数组。数组指针的使用在某些情况下与指针数组很相似,要注意区别。p是一个指针变量,它指向包含4个int元素的一维数组,此时p的增量以它...

字符指针变量和字符数组的区别
答:简单说一下:字符(非字符串数组,字符数组和字符串数组是有区别的,字符串数组每个元素都是一个字符串)数组是用来存放字符的数组,在内存中占一段连续的单元。所占内存存放的是字符串。定义方法为:char a[N];N为常量表达式,可初始化。字符指针是指向字符的指针,所占内存单元存放的是所指字符的内存...

深入理解二维数组名与指针的关系
答:你是否知道二维数组名其实是一个指针?但这里的“常量”并非指其内容不可更改,而是指其指向不能改变。下面将从编译器的角度深入探讨二维数组名与指针之间的关系和区别。指针常量二维数组名是一个指针常量,它指向数组中的第一个元素。与普通指针不同,你不能通过a++操作让a指向数组的第二个元素。樂数组名占据内...

地址和指针以及数组的概念 区别和联系
答:内存就像一个大楼,里面有很多很多的小房间,每个房间有个门牌号,这个就是地址。地址的作用就是能通过这个门牌号找到对应的房间。指针就是在多个房间里放了一个地址(这东西很大,需要很多个房间才能放得下),通过指针拿到放的地址可以去找目标房间(内存)。数组表示我需要一个能放n个地址或值(引用...

字符数组与字符指针变量的区别
答:四、使用字符串指针变量与字符数组的区别 用字符数组和字符指针变量都可实现字符串的存储和运算。 但两者是有区别的。在使用时应注意以下几个问题:1. 字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符...

指针数组和数组指针的区别有哪些?
答:指针数组和数组指针的区别主要有以下几点:1、数组名不可以改变,而指向数组的指针是可以改变的。字符串指针指向的字符串中的字符是不能改变的,而字符数组中的字符是可以改变的。求数组长度时,借用数组名可求得数组长度,而借用指针却得不到数组长度。2、数组名的指向不可以改变,而指向数组的指针是...

如何理解字符串赋值给指针与数组的区别
答:2、char *s1="hello" ; //字符串赋值给指针, 这表示s1与"hello"字符串指向同一个地址 这种形式也可以写成如下:char *s1 ; //定义一个指针变量 s1="hello"; //给指针变量赋值 3、char s2[]="hello"; //字符串赋值给数组,这种形式,只能在变量s2定义时才可以出现,无法分开来写。表示...