程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 我也要學C語言-第十三章:復合數據類型—指針與指針變量(一)

我也要學C語言-第十三章:復合數據類型—指針與指針變量(一)

編輯:關於C語言

指針的定義:

  指針是一種復合數據類型。它是對一類變量的描述。就像街道門牌的號碼!例如有一條X的街道,它有1024棟房子。那麼每棟房子可以用X[0-1024]來索引。假如我們每棟房子都可以保存一個整數值,那麼X街就有1024個不同的整型變量。而且每個變量都是可以使用房屋的編號去訪問。其實這裡的每棟房子的編號就是指針!我們把X換做是內存,每棟房子看成一個獨立的內存空間,那麼就可以這麼下結論,一個指針就是值為其他內存對象地址的數據類型。

指針的本質:

  其實指針的本質是對內存地址的抽象,抽象內存地址的方式有多種,只要你能通過一種方式達到對內存對象進行訪問,那麼這種方式就可以叫做指針。比如,我要找1個人,我通過電話本上的號碼找到他,這時,這個電話號碼叫指針(電話本叫指針變量)。又比如,我通過GPS找到他的地址坐標找到他,那麼這個地址坐標叫指針(這個GPS叫做指針變量)。

指針變量:

  存放一個值為其他內存對象地址的變量叫指針變量。

指針變量的聲明要點:

  如果我們申明一個指針變量 int *p,但是剛開始我們還無法確定需要給p什麼值的時候我們必須給p賦值NULL; NULL的實質是這樣的:#define NULL ((void *)0) 強制轉換的0.因為指針變量在debug環境下默認初始值是全C,release環境下是上次廢棄的值。

指針與地址的區別:

  地址是表示內存的編號信息;指針有2個信息,1個是地址信息,1個是此地址的解釋信息。比如:int *p表示此指針指向的地址的內存對象用int去解析.float *q表示此指針指向的地址的內存對象用float去解析。

C語言的直接引用:

   我們通過變量名來直接引用變量。例如a=123.編譯器會自動將變量名轉換成變量的存儲地址。然後再將123放入變量a的存儲空間中。

C語言的間接引用:

  首先將變量的地址存放在一個變量(指針變量),然後再通過存放變量的地址的指針變量來引用變量。

直接引用和間接引用的代碼事例:

#include <stdio.h>void main(){    int a, b;    int *p;//定義指針變量p        p = &b;//將變量b的地址存放在變量p中    a = 3;//直接引用變量a    *p = 5;//間接引用變量b}
關於間接引用的回憶:

  大家還記得我們前幾天我們學習的數組名傳參的內容嗎?我們看到復制過去的副本是數組的首地址。在我們的實現函數裡是針對這個地址再尋址。

關於數組名的思維的發散:

  我們能不能對數組名取地址呢?!

  其實對數組名取地址是沒有意義的。數組名是一個地址常量,比如123,321這樣的常量在內存中是沒有內存空間的。只有變量才有內存空間。常量被集成到指令裡,沒有專門保存它們的內存空間。

  為什麼常量進行函數傳參時常量會有內存空間呢?!

  比如:go(123).因為這個時候需要有個副本來保存參數。

  嚴格來說,只要程序運行起來了,都要占空間。只是常量沒有占到數據保存的區域裡,而是集成到指令裡去了。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved