C語言二級指針Demo - Win32 版本

指針可以指向一份普通類型的數據,也可以指向一份指針類型的數據。
一個指針指向的是另外一個指針,我們就稱它爲二級指針,或者指向指針的指針。
假設有一個 int 類型的變量 a,p1是指向 a 的指針變量,p2 又是指向 p1 的指針變量,它們的關係轉換爲C語言代碼:
    int a =100;
    int *p1 = &a;
    int **p2 = &p1;


指針變量也是一種變量,也會佔用存儲空間,也可以使用&獲取它的地址。C語言不限制指針的級數。

代碼;


#include <windows.h>
#include "resource.h"
 
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
 
HINSTANCE hInst;
TCHAR szClassName[] = TEXT("twoPointerDemo");
 
int WINAPI
WinMain (HINSTANCE hThisInstance,
         HINSTANCE hPrevInstance,
         LPSTR lpszArgument,
         int nFunsterStil)
{
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;
 
	hInst = hThisInstance;
	
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = MAKEINTRESOURCE (IDC_TWOPOINTERDEMO);
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 
    if (!RegisterClassEx (&wincl))
        return 0;
 
    hwnd = CreateWindowEx (
           0,
           szClassName,
           TEXT("C 二級指針Demo"),
           WS_OVERLAPPEDWINDOW,
           CW_USEDEFAULT,
           CW_USEDEFAULT,
           500,
           200,
           HWND_DESKTOP,
           NULL,
           hThisInstance,
           NULL
           );
 
    ShowWindow (hwnd, nFunsterStil);
 
    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
 
    return messages.wParam;
}
 
LRESULT CALLBACK
WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	RECT rt;	
	char szBuffer[100];	
	int a =909;
	int *p1 = &a;
	int **p2 = &p1;
	int ***p3 = &p2;
				
    switch (message)
    {
			case WM_COMMAND:
    		switch (LOWORD(wParam))
    		{
			case IDM_twoPointer:		
				hdc=GetDC(hwnd);
				wsprintf(szBuffer, "%d, %d, %d, %d",a, *p1, **p2, ***p3);
				TextOut(hdc,10,20,szBuffer,lstrlen(szBuffer));
    			wsprintf(szBuffer, "&p2 = %#X, p3 = %#X",&p2, p3);
				TextOut(hdc,10,50,szBuffer,lstrlen(szBuffer));
    			printf("&p1 = %#X, p2 = %#X, *p3 = %#X\n", &p1, p2, *p3);
    			wsprintf(szBuffer, "&p1 = %#X, p2 = %#X, *p3 = %#X",&p1, p2, *p3);
				TextOut(hdc,10,80,szBuffer,lstrlen(szBuffer));
    			wsprintf(szBuffer, " &a = %#X, p1 = %#X, *p2 = %#X, **p3 = %#X",&a, p1, *p2, **p3);
				TextOut(hdc,10,110,szBuffer,lstrlen(szBuffer));
				break;
		    case IDM_ABOUT:
				MessageBox (hwnd, TEXT ("twoPointerDemo v1.0\nCopyright (C) 2020\n by bo"),
                        TEXT ("twoPointerDemo"), MB_OK | MB_ICONINFORMATION);
				break;
			case IDM_EXIT:
				DestroyWindow(hwnd);
				break;
			default:
				return DefWindowProc(hwnd, message, wParam, lParam);	    		
		    }
    		break;
  		case WM_CREATE:
  			break;
    	case WM_PAINT:
			hdc = BeginPaint(hwnd, &ps);					
			GetClientRect(hwnd, &rt);				
			EndPaint(hwnd, &ps);
			break;
        case WM_DESTROY:
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}

運行結果;

工程;

參閱C語言中文網關於二級指針的講解;
http://c.biancheng.net/view/2016.html

資源和頭文件;

#include "resource.h"
#include <windows.h>

/////////////////////////////////////////////////////////////////////////////
//
// Menu
//

IDC_TWOPOINTERDEMO MENU 
BEGIN
    POPUP "&File"
    BEGIN
    	MENUITEM "C 二級指針 Demo",         IDM_twoPointer 
        MENUITEM "E&xit",                	IDM_EXIT
    END
    POPUP "&Help"
    BEGIN
        MENUITEM "&About ...",           	IDM_ABOUT
    END
END
#define 	IDM_EXIT		10001
#define 	IDM_ABOUT		10002

#define 	IDC_TWOPOINTERDEMO		10101
#define 	IDD_ABOUTBOX	10102
#define     IDM_twoPointer     40001

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章