C語言之指針

    學過編程語言的童鞋們都知道指針是C語言的精髓,學好了指針就等於學好了C語言,它可以直接對物理地址進行訪問,具備雙重功能,是嵌入式設計中必不可少的一門語言。C語言功能強大的主要緣由就是具備指針結構。指針是一種特殊的數據類型,直接指向目標的存儲地址,實現直接訪問對象存儲空間功能。編程

指針究竟是什麼

        計算機的內存被劃分爲多個存儲單元,這些存儲單元能夠以單個或者順序相連組成一個更大的方式被使用。每個單獨的存儲單元都是一個字節,它一般由8個位(bit)組成,每個位能夠表示的值只有0或1.每個存儲單元都被一個及其分配的標識惟一地表示,而這個標識就是地址(指針)。編程語言

指針的定義

      在C語言中,定義一個普通的變量(如正整數),咱們這樣作:int i;而定義一個指針變量(指針)咱們須要這樣作:int *p; 當咱們作出int i;這樣一個定義時,編譯器就會分配一個地址並和i關聯起來,而int將限定編譯器把這個區域中的內容做爲整型看待。如今咱們又有了int *p這個定義,假設p是指向變量i的,p中存的是變量i的地址。*表示p是一個指針,而int表示p中所存在的地址對應的變量(即變量i)的類型是int.由此指針定義的通常形式以下:
      基類型  *指針名;spa

指針變量

      指針變量:存放內存地址的變量。
      指針變量要先初始化後纔可以使用,否則就會成爲野指針,致使程序崩潰。操作系統

#include <stdio.h>

int main(int argc, const char * argv[]) {
    
    int num = 10; //定義一個變量
    int *p;   //定義一個指針變量
    p = &num;  //將變量num的地址賦值給指針變量p;
    
    *p = 30;  //爲p所指向地址的變量賦值
    
    printf("%p,--  %p;  %d == %d", &num, p, num, *p);
    
    return 0;
}
運行結果
0x7fff5fbff75c,--  0x7fff5fbff75c;  30 == 30Program ended with exit code: 0

     如下是錯誤的賦值:  設計

#include <stdio.h>

int main(int argc, const char * argv[]) {
    
    int num = 10; //定義一個變量
    int *p;   //定義一個指針變量
    //p = &num;  //將變量num的地址賦值給指針變量p;
    
    *p = 30;  //爲p所指向地址的變量賦值
    
    printf("%p,--  %p;  %d == %d", &num, p, num, *p);
    
    return 0;
}

     以上代碼指針變量未初始化就使用會出現野指針異常,致使程序崩潰。
     野指針:沒有指向任何地址的指針。(不合法)
     空指針:指向地址爲null的指針。(合法)
指針

     不能夠使用一個整型常量賦值給一個指針,由於內存是操做系統分配給咱們的,不是咱們隨便取的。以下:code

#include <stdio.h>

int main(int argc, const char * argv[]) {
    
    int *p = 200;
    
    printf("%d", *p);  
 
    return 0;
}
運行結果
程序崩潰,出現野指針異常

二級指針對象

      指向指針的指針。定義方式:int **pp; 代碼示例以下:內存

#include <stdio.h>

void printString(char **str)
{
    printf("%p\n",str);
    *str = "dqk";
}

int main(int argc, const char * argv[]) {
    int num = 100;  //定義一個變量
    int *p;   //定義一個指針變量
    p = &num;  //爲指針變量賦值
    int **pp;  //定義一個二級指針變量
    pp = &p;   //爲二級指針賦值
    **pp = 10;  //爲二級指針所指向的內存空間賦值
    
    printf("num:  %d\n", num);
    
    return 0;
}

運行結果:
num:  10
Program ended with exit code: 0

指針爲何要區分類型

  1. 變量的地址是變量所在棧存儲空間的首地址
  2. 指針變量僅僅能夠存儲一個地址編號,若是沒有類型,當經過指針就不知道要訪問多少個字節的存儲空間
  3. 指針區分類型是爲了在經過指針訪問它所指向的存儲空間的時候可以正確訪問
  4. 若是經過一個char類型的指針操做一個int的變量,若是值的二進制數據超過1字節,那麼就形成數據錯誤
  5. 若是經過一個int類型的指針操做一個char變量,那麼你就會修改了你不應修改的內存,形成程序邏輯錯誤。
相關文章
相關標籤/搜索