指针和数组
指针
:指针相当于一个变量,不过它存放的是其它变量在内存中的地址。
数组
:数组是用于储存多个相同类型数据的集合,且数组中的元素在内存中是连续存放的
指针数组和数组指针的区别?
指针数组(array of pointers)
:本质上是一个数组,只不过数组中的所有元素都是指针类型;
数组指针(a pointer to an array)
:本质上是一个指针,只不过该指针指向一个数组的首地址。
优先级:++ > () > [] > * > +
指针数组
指针数组的定义
int* a[4];
//定义了一个数组,该数组大小为4,且数组中元素类型为int型指针
//根据上面的优先级,int*a[4]等价于int*(a[4])
指针数组的大小
cout<<sizeof(a)<<endl;
//由于指针数组本质是数组,所以实际上是计算数组所占的字节数,对于x86,指针占4个字节,所以输出16,对于x64,指针占8个字节,所以输出32
指针数组的赋值
int arr_a[4] = { 1,2,3,4 };
//将arr_a中的元素赋给数组a,又由于数组a中元素类型是int*,所以将arr_a中每个元素的地址赋给arr中每个元素
for (int i = 0; i < 4; i++) {
a[i] = &arr_a[i];
}
for (int i = 0; i < 4; i++) {//输出为arr_a中每个元素的地址
cout << a[i] << " ";
}
cout<<endl;
for(int i=0;i<4;i++){ //输出为1234
cout << *a[i] << " ";
}
从下图可以看到,指针数组中每个元素的值,是所赋数组中每个元素的地址值,要想抓住获取所赋数组中每个元素的值,还需要解引用*
之所以arr_a数组中的元素,比如arr_a[0]在内存中以
01 00 00 00
的方式存储,而不是以00 00 00 01
的方式,是因为intel系列CPU以小端序
方式来保存数据
数组指针
数组指针定义
int(*b)[4];//定义了一个指针,该指针指向一个数组,且该数组大小为4,数组中元素类型为int型
数组指针的大小
cout << sizeof(b) << endl;
//由于数组指针本质是指针,所以实际上是计算指针所占的字节数,对于x86,指针占4个字节,所以输出4,对于x64,指针占8个字节,所以输出8
数组指针的赋值
int arr_b[4] = { 1,2,3,4 };
b=&arr_b;
for (int i = 0; i < 4; i++) {//输出为1 2 3 4
cout << (*b)[i] << " ";
}
从下图可以看到,数组指针中存放的就是所赋数组的首地址
注意:不能将数组直接传递给数组指针,因为数组指针存放的数组首地址,并不是数组首元素地址,虽然两者值是相同,但是操作不同,比如arr_b+1
相对于数组首地址+元素大小
,而b+1
相对于数组首地址+数组大小
,所以类型不匹配不能直接赋值,而可以b=&arr_b
,b相对于二维数组的行地址,现在指向arr_b
int main()
{
int(*b)[4];
int arr_b[4] = { 1,2,3,4 };
b = &arr_b;
cout << "sizeof(arr_b): " << sizeof(arr_b) << endl;
cout << "arr_b首地址: " << arr_b << endl;
cout << "arr_b+1: " << arr_b + 1 << endl;
cout << "b: " << b << endl;
cout << "b+1: " << b+1 << endl;
return 0;
}
输出结果如下: