Bootstrap

重新理解指针:用实例分清int* int** int*[] (int*)[]四者的区别

一,int * int**

这种就是最简单的指针指向一个对象。

int *直接指向一个对象;int **指向一个指针

如下:

    int initialInt = 10;
    int *initialIntPoint = &initialInt;     一个指针对象指向对象
    int **initialIntPointPoint = &initialIntPoint;       这个是双指针,指向一个指针对象
    cout << "对象:  " << initialInt << endl;
    cout << "对象地址:  " << &initialInt << endl;     
    cout << "指针对象:  " << initialIntPoint << endl;        对象的地址
    cout << "指针解引用:  " << *initialIntPoint << endl;        解引用获得对象的值
    cout << "双指针对象:  " << *initialIntPointPoint << endl;      指针对象的地址
    cout << "双指针解引用:  " << *initialIntPointPoint << endl;
    cout << "双指针双解引用:  " << **initialIntPointPoint << endl << endl;      使用双解引用获得原本的值


二,一维数组和二维数组

    int initialArray[10] = { 1, 5, 10, 15, 20 };
    cout << "数组首地址:  " << initialArray << endl;       就一维,所以直接就是第一个的位置
    cout << "数组首地址解引用:  " << *initialArray << endl;
    cout << "数组首地址+1解引用:  " << *(initialArray + 1) << endl << endl;

    int initialTwoArray[2][4] = { { 2, 5, 6, 8 }, { 22, 55, 66, 88 } };
    cout << "二维数组第一行地址:  " << initialTwoArray << endl;     相当于指向某一维
    cout << "二维数组第一行第一个地址:  " << *initialTwoArray << endl;      指向某一维的第一个的地址
    cout << "二维数组第一行第一个地址解引用(第一个的值):  " << **initialTwoArray << endl;    某一维的第一个的值
    cout << "二维数组第一行地址第一个地址+1:  " << *initialTwoArray + 1 << endl;        指向某一维的第二个地址
    cout << "二维数组第一行地址第一个地址+1解引用(第二个值):  " << *(*initialTwoArray + 1) << endl;
    cout << "二维数组第一行地址+1(第二行):  "<<initialTwoArray + 1 << endl;         指向第二维
    cout << "二维数组第一行地址+1的第一个地址(第二行第一个的地址):  " << *(initialTwoArray + 1) << endl;         第二维的第一个的地址
    cout << "二维数组第一行地址+1的第一个地址解引用(第二行第一个的值):  " << **(initialTwoArray + 1) << endl;        第二维的第一个的值
    cout << "示例:第二行的第二个的值:  "<<*(*(initialTwoArray + 1) + 1) << endl << endl;    第一维加一的解引用表示第二维的首地址  再加一的解引用表示第二维的第二个的值


三,int*p[]

表示是一个数组,数组里面每一个都是指针;

    int *initialPointArray[10];
    *initialPointArray = initialArray;
    cout << "指向一个指针数组的地址:  " << initialPointArray << endl;
    cout << "指向一个指针数组的地址的第一个指针的地址(数组第一个对象位置):  " << *initialPointArray << endl;
    cout << "指向一个指针数组的地址的第一个指针的地址的解引用(数组第一个对象值):  " << **initialPointArray << endl;
    cout << "指向一个指针数组的地址的第二个指针的地址的解引用(数组第二个对象值):  " << *(*initialPointArray + 1) << endl << endl;

四,(int*p)[]

表示每一个指针指向一个数组

    int(*initialArrayPoint)[10];
    initialArrayPoint = &initialArray;
    cout << "指针指向一个位数为10的数组:" << endl;    表示指向一个一维数组
    cout << "指针指向一个数组的指针地址:  " << initialArrayPoint << endl;   代表这个数组第一个位置
    cout << "指针指向一个数组的指针地址的第一个地址:  " << *initialArrayPoint << endl;    这个数组第一个位置的地址
    cout << "指针指向一个数组的指针地址的第一个地址的值:  " << **initialArrayPoint << endl << endl;        这个数组第一个位置的值

    int(*initialArrayPoint2)[4];
    initialArrayPoint2 = *(&initialTwoArray);
    cout << "指针指向一个位数为4的二维数组:" << endl;     表示指向一个二维数组
    cout << "指针指向一维数组的指针地址:  " << initialArrayPoint2 << endl;      二维数组的第一维
    cout << "指针指向一维数组的指针地址的第一个地址:  " << *initialArrayPoint2 << endl;       二维数组第一维的第一个地址
    cout << "指针指向一维数组的指针地址的第一个地址的值:  " << **initialArrayPoint2 << endl;     二维数组的第一维的第一个的值
    cout << "指针指向二维数组的指针地址:  " << initialArrayPoint2+1 << endl;      二维数组的第二维
    cout << "指针指向二维数组的指针地址的第一个地址:  " << *(initialArrayPoint2+1) << endl;
    cout << "指针指向二维数组的指针地址的第一个地址的值:  " << **(initialArrayPoint2+1) << endl;        二维数组第二维的第一个的值

全部代码如下,可以自己实验

#include<iostream>
using namespace std;

int main()
{
	int initialInt = 10;
	int *initialIntPoint = &initialInt;
	int **initialIntPointPoint = &initialIntPoint;
	cout << "对象:  " << initialInt << endl;
	cout << "对象地址:  " << &initialInt << endl;
	cout << "指针对象:  " << initialIntPoint << endl;
	cout << "指针解引用:  " << *initialIntPoint << endl;
	cout << "双指针对象:  " << initialIntPointPoint << endl;
	cout << "双指针解引用:  " << *initialIntPointPoint << endl;
	cout << "双指针双解引用:  " << **initialIntPointPoint << endl << endl;

	int initialArray[10] = { 1, 5, 10, 15, 20 };
	cout << "数组首地址:  " << initialArray << endl;
	cout << "数组首地址解引用:  " << *initialArray << endl;
	cout << "数组首地址+1解引用:  " << *(initialArray + 1) << endl << endl;

	int initialTwoArray[2][4] = { { 2, 5, 6, 8 }, { 22, 55, 66, 88 } };
	cout << "二维数组第一行地址:  " << initialTwoArray << endl;
	cout << "二维数组第一行第一个地址:  " << *initialTwoArray << endl;
	cout << "二维数组第一行第一个地址解引用(第一个的值):  " << **initialTwoArray << endl;
	cout << "二维数组第一行地址第一个地址+1:  " << *initialTwoArray + 1 << endl;
	cout << "二维数组第一行地址第一个地址+1解引用(第二个值):  " << *(*initialTwoArray + 1) << endl;
	cout << "二维数组第一行地址+1(第二行):  "<<initialTwoArray + 1 << endl;
	cout << "二维数组第一行地址+1的第一个地址(第二行第一个的地址):  " << *(initialTwoArray + 1) << endl;
	cout << "二维数组第一行地址+1的第一个地址解引用(第二行第一个的值):  " << **(initialTwoArray + 1) << endl;
	cout << "示例:第二行的第二个的值:  "<<*(*(initialTwoArray + 1) + 1) << endl << endl;

	int *initialPointArray[10];
	*initialPointArray = initialArray;
	cout << "指向一个指针数组的地址:  " << initialPointArray << endl;
	cout << "指向一个指针数组的地址的第一个指针的地址(数组第一个对象位置):  " << *initialPointArray << endl;
	cout << "指向一个指针数组的地址的第一个指针的地址的解引用(数组第一个对象值):  " << **initialPointArray << endl;
	cout << "指向一个指针数组的地址的第二个指针的地址的解引用(数组第二个对象值):  " << *(*initialPointArray + 1) << endl << endl;

	int(*initialArrayPoint)[10];
	initialArrayPoint = &initialArray;
	cout << "指针指向一个位数为10的数组:" << endl;
	cout << "指针指向一个数组的指针地址:  " << initialArrayPoint << endl;
	cout << "指针指向一个数组的指针地址的第一个地址:  " << *initialArrayPoint << endl;
	cout << "指针指向一个数组的指针地址的第一个地址的值:  " << **initialArrayPoint << endl << endl;

	int(*initialArrayPoint2)[4];
	initialArrayPoint2 = *(&initialTwoArray);
	cout << "指针指向一个位数为4的二维数组:" << endl;
	cout << "指针指向一维数组的指针地址:  " << initialArrayPoint2 << endl;
	cout << "指针指向一维数组的指针地址的第一个地址:  " << *initialArrayPoint2 << endl;
	cout << "指针指向一维数组的指针地址的第一个地址的值:  " << **initialArrayPoint2 << endl;
	cout << "指针指向二维数组的指针地址:  " << initialArrayPoint2+1 << endl;
	cout << "指针指向二维数组的指针地址的第一个地址:  " << *(initialArrayPoint2+1) << endl;
	cout << "指针指向二维数组的指针地址的第一个地址的值:  " << **(initialArrayPoint2 + 1) << endl << endl;

	system("pause");
	return 0;
}

;