C++ NULL指针学习 - Win32版本
生活随笔
收集整理的這篇文章主要介紹了
C++ NULL指针学习 - Win32版本
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在變量聲明的時候,如果沒有確切的地址可以賦值,為指針變量賦一個 NULL 值是一個良好的編程習慣。賦為 NULL 值的指針被稱為空指針。NULL 指針是一個定義在標準庫中的值為零的常量。
先看一下控制臺版本的程序運行;
在大多數的操作系統上,程序不允許訪問地址為 0 的內存,因為該內存是操作系統保留的。然而,內存地址 0 有特別重要的意義,它表明該指針不指向一個可訪問的內存位置。但按照慣例,如果指針包含空值(零值),則假定它不指向任何東西。
如需檢查一個空指針,您可以使用 if 語句,如下:
if(ptr) ? ? /* 如果 ptr 非空,則完成 */
if(!ptr) ? ?/* 如果 ptr 為空,則完成 */
因此,如果所有未使用的指針都被賦予空值,同時避免使用空指針,就可以防止誤用一個未初始化的指針。很多時候,未初始化的變量存有一些垃圾值,導致程序難以調試。
用 vs2013 可以看到,NULL 的定義就是:
define NULL 0
看如下程序,輸出 NULL=0;
看Win32版本的程序;
#include <windows.h> #include "resource.h"using namespace std;LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);HINSTANCE hInst; TCHAR szClassName[] = TEXT("nullptrDemo");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_NULLPTRDEMO);wincl.cbClsExtra = 0;wincl.cbWndExtra = 0;wincl.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);if (!RegisterClassEx (&wincl))return 0;hwnd = CreateWindowEx (0,szClassName,TEXT("C++ NULL指針 Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,300,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 *ptr = NULL;switch (message){case WM_COMMAND:switch (LOWORD(wParam)){case IDM_nullptr: hdc=GetDC(hwnd);wsprintf(szBuffer, "ptr 的值是%d",ptr);TextOut(hdc,10,10,szBuffer,lstrlen(szBuffer));wsprintf(szBuffer, "NULL=%d",NULL);TextOut(hdc,10,40,szBuffer,lstrlen(szBuffer));break;case IDM_ABOUT:MessageBox (hwnd, TEXT ("nullptrDemo v1.0\nCopyright (C) 2020\n by bo"),TEXT ("nullptrDemo"), 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; }? ? 運行結果如上圖;
菜單如上;
工程;
1
資源和頭文件;
#include "resource.h" #include <windows.h>/ // // Menu //IDC_NULLPTRDEMO MENU BEGINPOPUP "&File"BEGINMENUITEM "C++ Null指針 Demo", IDM_nullptrMENUITEM "E&xit", IDM_EXITENDPOPUP "&Help"BEGINMENUITEM "&About ...", IDM_ABOUTEND END #define IDM_EXIT 10001 #define IDM_ABOUT 10002#define IDC_NULLPTRDEMO 10101 #define IDD_ABOUTBOX 10102 #define IDM_nullptr 40001?
總結
以上是生活随笔為你收集整理的C++ NULL指针学习 - Win32版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 命令行设置Java环境变量
- 下一篇: Matlab 二维线画图函数 plot