指针的基础概念(进阶)
昨日回顾
#include <iostream>
using namespace std;
int main()
{
int n[5] = { 5, 4, 3, 2, 1 };
int *pn = n;
for (int i = 0; i < 5;i++)
{
cout << n[i] << endl;
}
for (int i = 0; i < 5;i++)
{
cout << *(pn + i) << endl;
}
for (int i = 0; i < 5; i++)
{
cout << *(n + i) << endl;
}
for (int i = 0; i < 5; i++)
{
cout << pn << endl;
cout <<*pn++ << endl;
}
cout << pn << endl;
for (int i = 0; i < 5; i++)
{
}
pn = n;
for (int i = 0; i < 5; i++)
{
(*pn)++;
}
for (int i = 0; i < 5; i++)
{
cout << n[i] << endl;
}
cout << sizeof(n) << endl;
cout << sizeof(pn) << endl;
cout << sizeof(&n[0]) << endl;
pn = &n[5];
cout << pn[-2] << endl;
return 0;
}
数组指针及定义
- 数组指针:指向数组的指针 &组名
- 定义: 类型 (*指针变量名)[大小];
- 类型:指针变量指向数组的类型
- 大小:指针变量指向数组的大小
int n[3][4] = {
{1,2,3,4},
{8,7,6,5},
{9,10,11,12}
};
int (*pn)[4]= n;
for (int i = 0; i < 3;i++)
{
cout << n + i << endl;
cout << *(n + i) << endl;
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4;j++)
{
cout << *(*(n + i)+j) << endl;
}
}
cout << &n[0][0] << endl;
cout << &n[1][0] << endl;
cout << &n[2][0] << endl;
cout << n << endl;
cout << &n[0] << endl;
cout << n[0] << endl;
cout << n[1] << endl;
cout << n[2] << endl;
int m[5];
cout << m << endl;
cout << &m << endl;
cout << m + 1 << endl;
cout << &m + 1 << endl;
指针数组与二级指针
- 指针数组:数组中每一个元素都是指针
- 二级指针:类型 **指针变量;
int(*p)[3][4];
cout << sizeof(p) << endl;
cout << sizeof(*p) << endl;
cout << sizeof(**p) << endl;
cout << sizeof(***p) << endl;
int* (*p1)[4][5][6];
cout << sizeof(p1) << endl;
cout << sizeof(*p1) << endl;
cout << sizeof(**p1) << endl;
cout << sizeof(***p1) << endl;
cout << sizeof(****p1) << endl;
cout << sizeof(*****p1) << endl;
int* (*p2[3][4])[4][5][6];
cout << sizeof(p2) << endl;
cout << sizeof(*p2) << endl;
cout << sizeof(**p2) << endl;
cout << sizeof(***p2) << endl;
cout << sizeof(****p2) << endl;
cout << sizeof(*****p2) << endl;
cout << sizeof(******p2) << endl;
cout << sizeof(*******p2) << endl;
int n[2][3];
int *pn = n[0];
int(*p3)[3]=n;
int **pp = &pn;
练习代码
int a[3][4] = {
{ 1, 2, 3, 4 },
{ 8, 7, 6, 5 },
{ 9, 10, 11, 12 }
};
int * arr[3][4] = {
NULL
};
int *p1 = a[0];
int **p2 = &p1;
int(*p3)[4] = &a[0];
int*(*p4)[4] = arr;
int*(*p5)[3][4] = &arr;
int*(*p6[3])[3][4];
int*(**p7[3])[3][4];
int **(**p8[3])[3][4];
double** (**p9[3][4])[5][6];
cout << sizeof(p9) << endl;
cout << sizeof(*p9) << endl;
cout << sizeof(**p9) << endl;
cout << sizeof(***p9) << endl;
cout << sizeof(****p9) << endl;
cout << sizeof(*****p9) << endl;
cout << sizeof(******p9) << endl;
cout << sizeof(*******p9) << endl;
cout << sizeof(********p9) << endl;