admin 管理员组

文章数量: 887031

c++,数组与指针的差别

c++中指针与数组的区别:

数组只能在静态存储区被创建(全局数组),或在栈上创建(临时数组);
数组名对应一块内存,其地址和容量在生命周期内保持不变,只有内容可改变。
指针可以随时指向任意内存的内存块,特征是“可变”。

数组和指针修改内容时的不同:
char a[] = “hello”;
a[0] = ‘X’;//这个没问题。
这段语句表示:创建一个字符串并赋值为hello,修改字符串的第一个字符,没有问题。

char *p = “hello”;
p[0] = ‘X’;//这是个错误,有的编译器可能发现不了。
这段语句表示:用一个指针指向常量字符串“hello”,修改字符串的第一个字符时,在编译器中直接出现的常量字符串都会自带const,编译器在这个修改语法上不会发现有什么问题,但在运行时,就会因试图修改const常量而导致运行错误。

上面那种用法编译器会在初始化时就会报错:

数组和指针在内容复制和比较时的不同:

数组:
数组名无法直接进行比较,想要将数组a的值复制给数组b,使用b=a会产生编译错误,应该用标准库函数strcpy进行复制。
想要判断数组a和b的内容是否相同,使用if(a == b)会产生编译错误,应该使用标准库函数strcmp进行比较。

指针:
指针p = a不会将数组a复制到p,而是将a的首地址给p,指针复制需要申请一片大小与目的数组相等的内存,使用strcpy对指针名和数组名进行复制。
指针比较,使用strcmp比较两个指针名就可。

因此用字符串指针时,初始化不应该用p = "hello"这样的操作,而应该使用strcpy,或者for循环挨个赋值,或者其他赋值方法,而不应该用直接指向常量字符串的方法。

数组与指针内存容量上的不同:
数组的字节数sizeof()为其类型字节数和长度的乘积。
指针的字节数sizeof()为一个指针的字节数,即4。

c/c++语言无法获取到指针所指的内存容量,除非在申请内存的时候记住它。
当数组作为函数的参数进行传递时,数组将自动退化为同类型的指针,所以传入数组做参数时一般需要将其长度也作为参数传入,传入的数组想要查看其sizeof时值为4。

本文标签: c 数组与指针的差别