cpp: double-pointer

发布时间 2023-07-02 00:42:23作者: ®Geovin Du Dream Park™

对于一个二维数组如: int aryy[9][9];
求数组元素的总数: sizeof(a) / sizeof(int)
而数组行数则为 :( sizeof(a) / sizeof(int) )/ ( sizeof(a[0]) / sizeof(int) )
求数组列数: sizeof(a[0])/sizeof(int)
vector<vector<int> > matrix
int row=matrix.size();//行数
int collor=matrix[0].size();//列数
// level-1 pointer declaration
datatype *pointer;

// level-2 pointer declaration
datatype **pointer;

// level-3 pointer declaration
datatype ***pointer;
https://www.geeksforgeeks.org/c-pointer-to-pointer-double-pointer/
https://www.geeksforgeeks.org/how-many-levels-of-pointers-can-we-have-in-c-cpp/

 

/*****************************************************************//**
 * \file   ConsoleTextFileDemoApp.cpp  c++ 14
 * \brief   
 * 
 * 
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
// ConsoleTextFileDemoApp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//https://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using-new
//geovindu Geovin Du
#define _UNICODE

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <windows.h>
#include <string>
#include <string.h>
#include <fstream>
#include <stdio.h>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <cstdio>
#include <codecvt>
#include <assert.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <io.h>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
#include <fstream>
#include <sstream>


#define UNASSIGNED 0


using namespace std;


/// <summary>
/// 打印二维数组 
/// </summary>
/// <param name="p"></param>
/// <param name="rowNum">行</param>
/// <param name="coluNum">列</param>
void PrintPtr(int** p, int rowNum, int coluNumn)
{
	for (int i = 0; i < rowNum; i++)
	{
		for (int j = 0; j < coluNumn; j++)
			cout << p[i][j] << "	";
		cout << endl;
	}
}
/// <summary>
/// 
/// </summary>
/// <param name="arry"></param>
/// <param name="row"></param>
void PrintAr2(int arry[][9], int row)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < 9; j++)
			cout << arry[i][j] << "	";
		cout << endl;
	}
}

/// <summary>
/// 打印二维数组 
/// </summary>
/// <param name="p"></param>
/// <param name="rowNum"></param>
/// <param name="coluNum"></param>
void print_p(int** p, int rowNum, int coluNum)
{
	cout << "\n------------------------" << endl;
	for (int i = 0; i < rowNum; i++)
	{
		for (int j = 0; j < coluNum; j++)
		{
			cout << p[i][j] << " ";
		}
		cout << endl;
	}
}

/// <summary>
/// 
/// </summary>
/// <param name="p"></param>
/// <param name="RowSize"></param>
/// <param name="LineSize"></param>
void print_array(int* p, int RowSize, int LineSize)
{
	int i, j;
	for (i = 0; i < RowSize; i++)
	{
		for (j = 0; j < LineSize; j++)
			printf("%d ", *(p + i * LineSize + j));
		printf("\n");
	}
}

/// <summary>
/// 初始化二维数组,即给指针p分配内存。这里注意要使用引用 
/// 对于一个二维数组如: int a[2][5];
///求数组元素的总数: sizeof(a) / sizeof(int)
///而数组行数则为 :(sizeof(a) / sizeof(int)) / (sizeof(a[0]) / sizeof(int))
///求数组列数: sizeof(a[0]) / sizeof(int)
///vector<vector<int> > matrix
///int row = matrix.size();//行数
///int col = matrix[0].size();//列数
/// </summary>
/// <param name="p"></param>
/// <param name="rowNum"></param>
/// <param name="coluNum"></param>
void init_p(int**& p, int* rowNum, int* coluNum)
{
	cin >> *rowNum >> *coluNum;
	p = new int* [*rowNum];
	for (int i = 0; i < *rowNum; i++)
	{
		p[i] = new int[*coluNum];
	}
}

/// <summary>
/// 一级指针 二维数组
/// </summary>
/// <param name="matrix">二维指针</param>
/// <param name="rowSize">行</param>
/// <param name="colSize">列</param>
void print2D(int* matrix, int rowSize, int colSize)
{
	for (int i = 0; i < rowSize; ++i) {
		for (int j = 0; j < colSize; ++j) {
			cout << *(matrix + (i * colSize + j)) << " ";
		}
		cout << endl;
	}
	cout << endl;
}
/// <summary>
/// 二级指二维数
/// </summary>
/// <param name="matrix"></param>
/// <param name="rowSize"></param>
/// <param name="colSize"></param>
void print2D2(int** matrix, int rowSize, int colSize)
{
	for (int i = 0; i < rowSize; ++i) {
		for (int j = 0; j < colSize; ++j) {
			//这里必须 重解释成 1级指针,再移位。
//            cout << *( reinterpret_cast<int*>(matrix) + (i * colSize + j)) << " ";
			cout << *((int*)matrix + (i * colSize + j)) << " ";
		}
		cout << endl;
	}
	cout << endl;
}



int main(int argc, char const* argv[])
{
    std::cout << "Hello World! 涂聚文! \n";


	

	//s1.anssudoku();

    //string duname;
    //cout << "输入姓名:" << endl;
    //cin >> duname;
    //cout << "name:" << duname << endl;
	int arsudoku[9][9] = {
	{0, 0, 0, 0, 0, 9, 0, 5, 0},
	{0, 0, 8, 0, 0, 0, 0, 7, 9},
	{0, 0, 1, 5, 0, 2, 0, 0, 0},
	{3, 0, 0, 0, 1, 0, 5, 0, 7},
	{2, 0, 4, 0, 0, 7, 0, 0, 0},
	{0, 0, 0, 6, 0, 0, 2, 0, 0},
	{0, 0, 0, 0, 7, 0, 3, 4, 0},
	{1, 0, 0, 0, 0, 0, 0, 0, 0},
	{0, 3, 0, 0, 5, 6, 0, 0, 0}
	};

	
	int* pi;
	pi = arsudoku[0];
	for (int i = 0; i < sizeof(arsudoku) / sizeof(int); i++)
	{
		cout << "\t" << &arsudoku[i] << endl; //内存地址
		//p = arr[i];
		cout << *pi++ << endl;
	}

	cout <<"point"<< * pi << endl;
	///
	print2D(reinterpret_cast<int*>(arsudoku), sizeof(arsudoku) / sizeof(arsudoku[0]), sizeof(arsudoku[0]) / sizeof(int));
	//调用一级指针二维数据
	//print2D2(reinterpret_cast<int **>(arsudoku), 9, 9);
	//
	print2D2((int**)arsudoku, sizeof(arsudoku) / sizeof(arsudoku[0]),sizeof(arsudoku[0]) / sizeof(int));

	int number = 1;

	for (auto row = begin(arsudoku); row != end(arsudoku); ++row)
	{

		for (auto data = begin(*row); data != end(*row); ++data) {

			*data = number++;

		}

	}

		


	int** p = new int* [9];
	for (int i = 0; i < 9; i++)
		p[i] = new int[10];
	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < 9; j++)
			p[i][j] = arsudoku[i][j];
	}
	cout << "传递数组名" << endl;
	PrintAr2(arsudoku, 9);
	cout << "传递指针" << endl;
	PrintPtr(p, 9, 9);

	int i, j;
	print_array((int*)arsudoku, 9, 9);
	cout << "***********" << endl;
	for (i = 0; i <9; i++)
	{
		for (j = 0; j < 9; j++)
			printf("%d ", *(*(arsudoku + i) + j));
		printf("\n");
	}

	wstring allstr;
	wstring sname;
	wstring stuID;//学号
	int num;//编号
	double english;//英语成绩
	double math;//数学成绩
	double cpp;//C++成绩
	int location = 0;//位置编号
	int flag = 0;//标记是否有对应的编号

	wcout << L"请输入新增学生的信息" << endl;
	wcout << L"姓名\t" << "学号\t" << "英语\t" << "数学\t" << "C++\t" << endl;
	wcin.imbue(locale("chs"));//获取的是中文
	wcout.imbue(locale("chs"));
	wcin >> sname >> stuID >> english >> math >> cpp;

	//allstr = sname + ' ' + stuID;
	allstr.append(sname); //C++ wstring::append
	allstr.append(L"\t");
	allstr.append(stuID);
	allstr.append(L"\t");
	allstr.append(to_wstring(english));
	allstr.append(L"\t");
	allstr.append(to_wstring(math));
	allstr.append(L"\t");
	allstr.append(to_wstring(cpp));

	wcout << allstr << endl;
    system("pause");
    return 0;
}


// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
#define UNICODE