数组与指针
数组与指针的区别与联系
一、概念
数组:数组是用于储存多个相同类型的数据的集合。
指针:指针相当于一个变量,但是它和不同变量不同,它存放的是其他变量在内存中的地址。
二、复制、储存方式、求sizeof、初始化等
1.赋值
同类型指针变量可以相互赋值,数组不行,只能一个一个元素的赋值
2.储存方式
数组
数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下标进行访问的,多维数组在内存中是按照一维数组储存的,只是在逻辑上是多维的。
数组的储存空间不是在静态区就是在栈上。
指针
指针可以指向任意类型数据,指针的类型说明他所指向地址空间的内存中储存数据的类型
由于指针本身就是变量,他储存的也是变量,所以它的储存空间不确定。
3.求sizeof
数组
数组所占储存空间的内存:sizeof(数组名)
数组的大小:sizeof(数组名)/sizeof(数据类型)
指针
在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4,在64位平台下,无论指针的类型是什么,sizeof(指针名)都是8。
链接: 关于指针和数组求sizeof
4.初始化
数组
(1)char a[]={
"Hello"};//按字符串初始化,大小为6.
(2)char b[]={
'H','e','l','l'};//按字符初始化(错误,输出时将会乱码,没有结束符)
(3)char c[]={
'H','e','l','l','o','\0'};//按字符初始化
这里补充一个大家的误区,就是关于数组的创建和销毁,尤其是多维数组的创建与销毁。
(1)一维数组:
int* arr = new int[n];//创建一维数组
delete[] arr;//销毁
(2)二维数组:
int** arr = new int*[row];//这样相当于创建了数组有多少行
for(int i=0;i<row;i++)
{
arr[i] = new int[col];//到这里才算创建好了
}
//释放
for(int i=0;i<row;i++)
{
delete[] arr[i];