刚开始学习编程的时候总以为数组就是指针,指针就是数组,容易混淆。其实,数组和指针是有区别的。
数组与指针的区别:
数组:
1、数组要么在静态存储区被创建(全局数组),要么在栈上被创建(局部数组)
2、数组名对应着(不是指向)一块内存(大小已知),其地址与容量在生命周期内保持不变,只有数组内容 可以改变。
指针:
1、指针可以随时指向任意类型的内存块(不同类型可以通过强制类型转换来实现),它的特征是“可变的”。
2、常用指针来操作动态内存。
指针远比数组灵活,但也更危险。
比较内存内容:
char arr[] = "hello";
arr[0] = 'a';
arr指向一块确定的内存,现在数组里的内存是可以通过访问来修改的
char* p = "hello";
p[0] = 'b';
p此时指向的是一块char类型的内存地址,地址里有一个常量字符串,p[0]企图修改常量字符串内容是不被允许的,就像是你想将2赋值给1(1 = 2)一样是不被允许的。
内存容量
char arr[] = "hello";
char* p = arr;
cout<<sizeof(arr)<<endl; //6
cout<<sizeof(p)<<endl; //4
arr数组里包括“h e l l o \0”等六个字符,sizeof(arr)相当于求数组的容量。
在C/C++语言中没办法知道指针所指向的内存容量,sizeof(p)相当于求指针类型的大小(相当于sizeof(char*))
void fun(char arr[50])
{
<span style="white-space:pre"> </span>cout<<sizeof(arr)<<endl;//4
}
当数组作为函数的参数进行传递时,该数组自动退化成了同类型的指针,不管数组容量有多大,sizeof(arr)都是4,相当于sizeof(char*),所以我们在以数组为参数的函数中,我们就不能求数组的大小了,如果函数需要用到数组的大小,需要在定义数组的地方求出数据并一块传入。