指針

来源:http://www.cnblogs.com/letben/archive/2016/02/24/5213967.html
-Advertisement-
Play Games

指針: 一、聲明 一個 int 類型的 指針 然後 賦值。 二、聲明中直接賦值。 三、空指針 四、懸空指針 野指針: 懸空指針本質上就是 聲明瞭一個 指針類型的變數【如:int *p】,並且沒有賦值。在沒有賦初值的情況下,利用這個指針進行修改【如:*p=100】。就相當於這個指針指向了一個未知的地址


指針:

一、聲明 一個 int 類型的 指針 然後 賦值。

 

二、聲明中直接賦值。 

 

三、空指針 

 

四、懸空指針 野指針:

 

懸空指針本質上就是 聲明瞭一個 指針類型的變數【如:int *p】,並且沒有賦值。在沒有賦初值的情況下,利用這個指針進行修改【如:*p=100】。就相當於這個指針指向了一個未知的地址。並且還做了修改。那如果這個地址是其他進程。還做了修改,就會造成系統的不穩定。因為這種不可靠的修改行為極其可怕,就好像呂伯奢開放了自己家給曹操,曹操進來以後胡亂的修改呂伯奢家人的數據,把是否存活全都置成了false.dos版本的操作系統下,這種修改行為還是可以的。但是隨著後來越來越多的黑客想要修改操作系統的數據,就相當於我操作系統很大度,開放了我自己給你,你運行了一些東西,讓我這個操作系統土崩瓦解了。所以後來的操作系統做成瞭如下圖的樣子:

 

也就是隨著後來越來越多的這種可怕行徑,導致後來的法律發現如果你越界訪問的話,我們就認定你是非法入室罪名。就是有一個進程不斷地檢測,如果 有用戶進程非法訪問,就立刻把這個進程從記憶體中清楚,以保護操作系統的穩定。所以我們現在 是可以放心做這種懸空指針的案例演示的,不過就是 我們的進程遇到了問題,被迫中止而已。這是可以接受的。

五、指針的相容問題

以下代碼:

#include <iostream>


void function1(void);
void function2(void);
void function3(void);
void function4(void);
void function5(void);
int main() {
    
    function5();
    
    return 0;
}

/**
    聲明 一個 int 類型的 指針 然後 賦值。 
*/
void function1(void){
    int i= 10;
    printf("修改前i的值為:%d\n",i);
    int *p;//定義一個 執行int 類型的指針 變數名為p.
    p = &i;//取i的地址 賦給 p。
    *p = 100;//*p表示:訪問p中的內容,根據int 這個類型,來提取這個元素。
    //又因為剛剛給這個裡面賦了i這個值 ,所以*p 相當於i。那麼i=100.
    //所以 *p = 100 本質上是一個賦值語句,將i的值改成了100.
    printf("修改後i的值為:%d\n",i);
}
/**
    聲明中直接賦值。 
*/ 
void function2(void){
    int i =10;
    int *p = &i;
    printf("i的值為:%d\n",*p);
} 
/**
    空指針 
*/
void function3(void){
    
    //int b = NULL;
    //printf("b的值為:%d\n",b);
    int *p = NULL;//這就是傳說中的空指針,在java中報了錯比較常見這個東西的,
    //就是因為在創建對象的時候,沒有給定一個初值,導致 報了那樣一個異常 
    printf("指針p的值為:%d,%p,%x",p,p,p);
}

/**
    懸空指針,野指針 :其實 跟function1()的內容有相像的地方,就是聲明一個指針類型的變數,但是不賦值。
    這個 編譯是可以通過的,但是運行的時候會報錯。在visual studio c++ 裡面編譯通不過。 
    這是因為。誰也不知道 到底讓p指向了一個什麼樣的記憶體單元。並且在不知情的情況下還給 它賦了100這個值,
    那這樣就會極其不安全。 
*/ 
void function4(void){
    int *p; 
    *p = 100;
    printf("懸空指針指向的地址的值是:%d\n",*p); 
} 

/**
    指針的相容問題 
*/
void function5(void){
    //前面在第一個案例的時候有特意提到聲明瞭一個 int類型的指針變數,是因為除此之外還有各種類型的指針變數。
    //比如:
    char *pc;
    int array[10];
    int *p =array;//這個我現在有點兒蒙。。。 
    double *pd;
    //也就是我們說的,先去找到那個對應的元素然後按照 char 類型取pc裡面的內容 
    //按照double類型,取pd裡面的值
    //所以對於指針來說 他們的大小都一樣:
    printf("指針變數pc的大小:%d\n指針變數p的大小%d\n指針變數pd的大小%d\n",sizeof(pc),sizeof(p),sizeof(pd)); 
    //【查看運行結果圖】,會發現在這台機器裡面,所有的指針變數都是8,說明這是一個64位的操作系統。
    //如果這些數值都是4說明這是一個32位的操作系統。所以指針變數這個值的大小是操作系統相關的。 
    
    //所以,在取值的時候需要為這個被指向的對象指明一個類型,方便在取的時候,按照合理的類型把這個元素提取出來。 
    
    // 為了繼續進行先把這裡註釋掉,這裡很關鍵!一定要動手嘗試 
    //所以 如果是
    int *p1;
    char c;
    //p1=&c;
    //就會報一個這樣的錯誤: cannot convert 'char*' to 'int*' in assignment
    int *p2;
    unsigned int i1;
    //p1=&i1;
    //這個編譯還是很嚴格的,就是不行。在vs裡面這是被允許的。 
    //[Error] invalid conversion from 'unsigned int*' to 'int*' [-fpermissive]
    
    //但是 如果聲明一個 指向空類型的 指針 在進行指向是被允許的。
     
    void *pv;
    pv=&c;
    pv=&i1; 
    //這樣就是編譯通過的。 
    
    //p1 = pv;
    //[Error] invalid conversion from 'unsigned int*' to 'int*' [-fpermissive]    
}

 

上面是 main.cpp 的情況

 

下麵是 main.c的情況:

 

#include <iostream>


int main() {
    int *p;
    unsigned int i;
    //p=&i; 
    //[Error] invalid conversion from 'unsigned int*' to 'int*' [-fpermissive]
    int ii;
    p=&ii;
    
    void *p1;
    p1 = p;
    
    char *pc;
    //pc = p1;
    //[Error] invalid conversion from 'void*' to 'char*' [-fpermissive]
    return 0;
}

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 很多情況下,我們需要把數據類型做一些轉換,供其它外部的子系統調用。 最為典型的是生成json格式供javascript作調用。 現成的組件Newtonsoft.Json可以實現object2json之間的轉換。 Newtonsoft.Json.JavaScriptConvert.SerializeO
  • http://www.codeproject.com/Tips/1080310/Csharp-Binary-Literal-Helper-Class C#目前不支持二進位數據直接賦值 int bits=0b00010101; 如果可以直接賦值,那麼在按位運算的時候將會帶來很大的方便,所以你可以通過這
  • 很驚訝昨晚寫的第一篇學習筆記竟然有個評論了,只是今天還是對基礎知識提不起精神,還是先看那三本書瞭解一下程式開發的大概流程吧。 今天不知道怎麼閑逛就找到了這個網站,說是專門用於編程練習的,用google賬戶就能夠登錄,簡單整理了一下免費版可以直接使用的!如下表: 編程語言 開源項目 代碼行數 源程式
  • 具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在伺服器端保持狀態的方案。同時我們也看到,由於採用伺服器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要藉助於cookie機制來達到保存標識的目的,但實際上它還有其他選擇。 cookie機制
  • 用c#編寫window服務常見的幾個事件 protected int i = 0; public Service1() { InitializeComponent(); } //啟動服務時執行 protected override void OnStart(string[] args) { //使時
  • 本人文筆不好,大致說說自己的困惑 隨著2016的到來,一年一度的職業規劃即將而來,因為本人一直從事著C#工作,也接觸了一些前端知識。 但是由於微軟老大哥,技術更新太快,學習成本太高,但是眾所周知C#工資並不高,畢竟人活著要吃一口飯, ,因此產生換個技術的想法。 但是換什麼技術啊?真是糾結啊 比如手機
  • 安裝JDK 選擇安裝目錄 安裝過程中會出現兩次 安裝提示 。第一次是安裝 jdk ,第二次是安裝 jre 。建議兩個都安裝在同一個java文件夾中的不同文件夾中。(不能都安裝在java文件夾的根目錄下,jdk和jre安裝在同一文件夾會出錯) 如下圖所示 1:安裝jdk 隨意選擇目錄 只需把預設安裝目...
  • 半形全形的處理是字元串處理的常見問題,本文嘗試為大家提供一個思路。 一、概念 全形字元unicode編碼從65281~65374 (十六進位 0xFF01 ~ 0xFF5E)半形字元unicode編碼從33~126 (十六進位 0x21~ 0x7E)空格比較特殊,全形為 12288(0x3000),
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...