C++学习记录-指针2(指针与数组)

指针与一维数组

创建一个指针指向一维数组,此时指针指向的是一维数组的首地址。

示例:

1
2
3
int arr[2]={1,2};
int *p1=arr;//指针指向arr的首地址,即1的地址
int *p2=&arr[1];//此时指针指向的是2的地址

利用指针遍历数组时,让指针++即可让指针向后移动一个位置,指向下一个数值,让指针+i即可让指针向后移动i个位置

示例:

1
2
p1++;//此时p1指向2的地址
p1+1//此时p1指向2的地址

下面附上指针与一维数组关系表格:

表现形式 表现形式 表现形式 表现形式 含义
&arr[0] arr p 一维数组arr的首地址
&arr[i] arr+i p+i 一维数组下标为i的元素地址
arr[0] *arr *p 一维数组第一个元素的值
a[i] *(arr+i) *(p+i) p[i] 一维数组下标为i的元素的值

指针与二维数组

1.二维数组其实是一维数组的集合

示例代码:

1
2
3
4
5
int arr[2][2]={
{0,1},
{2,3}
};
//定义了一个2行2列的二维数组,它其实是由两个 含有两个元素的一维数组 拼成的

定义二维数组指针:类型 (*指针名)[二维数组的列数]=arr

示例代码:

1
2
int (*parr)[2]=arr;//定义二维数组指针
//这其实是一个二级指针。指针指向一维数组{0,1}的首地址。后面的【2】则是 一维数组 的个数(即列数)。

解引用方法:先解成一维数组的指针,再按照一维数组的指针进行解引用解出对应的元素

示例代码:

1
2
3
cout<<*parr<<endl; //解出第一个一维数组的指针,打印第一个一维数组的地址008FFC5C
cout<<*(*parr+1)<<endl;//先解出第一个一维数组的指针,再往后移动一个位置,再解引用,此时打印1
cout<<*(*(parr+1)+1)<<endl;//此时打印3

visual studio中用变量创建数组:

1
2
3
4
5
6
7
8
9
10
int m,n;
cin>>m>>n;
int *parr=new int[m];//动态创建一维数组

//动态创建二维数组
int** brr = new int*[m];//先创建一维数组的个数(有几行)
for (int i = 0; i < m; i++)
{
brr[i] = new int[n];//再创建一维数组(对每行创建)
}

关于数组指针和sizeof的一些冷知识

1.数组名其实是一个指针,指向该数组的首地址,在数组名后面加 [下标] 相当于对该指针解一次引用。

2.sizeof(数组的首地址),会求得数组的元素个数*4,sizeof(数组的地址),会求得4。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int brr[3] = { 0,1,2 };
cout << sizeof(brr) << " "<<sizeof(&brr) << endl;
cout << brr << " " << &brr << endl;
//brr为数组的首地址,&brr为数组的地址。

cout << endl;

int arr[3][4] = {
0,1,16,17,
2,3,17,18,
19,20,21,22,
};

cout << sizeof(arr) << " " << sizeof(arr[1]) << endl;
cout << arr + 1 <<" " << arr[1] << endl;

//arr为二维数组的首地址,arr[1]为二维数组中一维数组(2,3,17,18)的首地址

运行结果:

1
2
3
4
5
6
12 4
00FDFDC8 00FDFDC8

48 16
00FDFDA0 00FDFDA0
请按任意键继续. . .