C語言的指針,簡介

2020-12-11 閒聊代碼

指針,是一個表示變量或函數的地址的無符號整數。

指針的字節數,與CPU的位數有關,32位機是4位元組,64位機是8位元組。

與高級語言的long類型的大小是一致的。

所以在java的JNI庫裡,如果需要把native層的C結構體的指針保存到java層,一般是定義一個long類型的變量。

指針指向的變量,可以是普通變量、數組變量、結構體變量,以及數組元素、結構體的成員變量,還可以是指針變量。

指針還可以指向函數,叫做函數指針。

指針如果指向數組,指的是數組的首地址,即數組的0號元素的地址。

數組變量名,代表的也是數組的首地址。

如果指向數組的某一個元素,則是這個元素的地址。

int a[10];

int *p = a; //指向數組首地址

p = &a[1]; //指向1號元素的地址

如果指向結構體變量,就是這個結構體的地址。

C語言的結構體的地址,也是結構體的第一個成員變量的地址。

當然,類型是不一樣的,數值一樣。

C語言一般把管理結構的結構體變量,嵌入到它要管的數據結構裡,而且一般會放在第一個位置。

例如,我們用紅黑樹管理定時器,那麼定時器的結構體是這樣的:

struct timer {

struct rb_node node; //紅黑樹的節點

int64_t time; //定時器的觸發時間

int (*handler)(void* data); //回調函數

void* data; //回調函數的參數

};

這樣timer和rb_node的指針就可以互相轉換。

獲取紅黑樹的最小元素,然後拿到它記錄的時間,與當前的系統時間比較,就可以判斷它是否被觸發:

int ret = timer->handler(timer->data);

timer是定時器的結構體指針。

handler是結構體的回調函數指針,它是結構體的成員變量,還是一個函數指針。

data是結構體的回調函數的參數,它也是一個指針,還是結構體的成員變量。

如果指向函數,就是函數的地址,也就是函數的第一條指令的地址。

編譯完的函數,是個機器指令的序列。

如果是intel這種CISC的,指令的大小是變化的。

如果是ARM這種RISC的,指令的大小是固定的,一般是4位元組,那麼函數就是個指令的數組。

指針,也是個變量。只是它的值存的是其他變量或函數的地址。

既然是變量,那麼它也有地址,也可以有指向它的指針,即二級指針。

二級指針的典型應用,就是二叉樹。

二叉樹,要把子節點的指針,存到父節點的left或者right指針變量裡。有時候會用到left或right的地址,就是個二級指針。

相關焦點

  • C 語言程序設計---指針
    上次 C 語言寫到了數組,有些書是先講指針,有些書是先講函數,按照我以前學習 C 語言的順序,以及對 C 語言的理解,學習的順序是這樣的:數組--->指針--->函數,所以本篇文章講解 C 之指針。C 語言是值得好好學習的一門語言,是一門基礎語言,更是我編程入門的語言,其中很多編程思想,至今影響著我,在工作中對我的幫助很大。
  • c語言指針與字符數組
    ,字符串的使用在C語言中也是非常重要的,常常會遇到一些操作,如字符串的修改、拷貝、字符串長度等,在物聯網的應用中也尤為突出,物聯網應用中所用的模組,大多是需要使用AT指令的,這就需要對字符串的操作。我們定義一個指針變量char * pc;內存示意,通常指針是4個字節,假設這裡的地址是200
  • 為什麼指針被譽為 C 語言靈魂?
    所以,要想徹底理解指針,首先要理解 C 語言中變量的存儲本質,也就是內存。在 C 語言中我們會這樣定義變量:int a = 999;char c = 'c';當你寫下一個變量定義的時候,實際上是向內存申請了一塊空間來存放你的變量。
  • C語言簡明教程(九)指針(二)
    通過改變指針變量的值使它指向字符串中的不同字符。編寫程序 11-3.c 用 i++ 來遍歷數組,程序 11-4.c 用 p++ 遍歷數組。解題思路:定義一個函數 copy_string 用來實現字符串複製的功能,在主函數中調用此函數,函數的形參和實參可以分別用字符數組名或字符指針變量。分別編程,以供分析比較。編寫程序 11-5.c 用字符數組名作為函數參數,程序 11-6.c 用字符型指針變量作實參,程序 11-7.c 用字符指針變量作形參和實參。
  • C語言指針詳解
    先聲明幾個指針放著做例子:例一:(1)int *ptr;(2)char *ptr;(3)int **ptr;(4)int (*ptr)[3];(5)int *(*ptr)[4];如果看不懂後幾個例子的話,請參閱我前段時間貼出的文章 如何理解c和c++的複雜類型聲明>&
  • c語言的指針真的很有趣
    指針是一個很有趣的東西,想要成為一個出色的程式設計師,那麼指針就要學的好,指針涉及到內存分配的問題。每一個變量都有自己的內存,可以使用&來訪問變量存儲的位置。ta就是一個地址。這語句中用*來指定指針變量int *ip; /* 一個整型的指針 */double *dp; /* 一個 double 型的指針 */float *fp; /* 一個浮點型的指針 */
  • C語言陷阱與技巧31節,都說void*指針是「萬能指針」,它萬能在哪
    (void *dest, constvoid *src, size_t n);void *memmove(void *dest, constvoid *src, size_t n);前面的章節在討論C語言指針時,提到指針從某種程度上來說,無非就是一個地址,它的類型只是用於說明數據結構的。
  • C 語言指針詳解
    指針pp為指向指針p的指針定義指針變量C語言中,定義變量時,在變量名 前 寫一個 * 星號,這個變量就變成了對應變量類型的指針變量。必要時要加( ) 來避免優先級的問題。引申:C語言中,定義變量時,在定義的最前面寫上typedef ,那麼這個變量名就成了一種類型,即這個類型的同義詞。
  • C語言 | 指向指針的指針
    「要成為絕世高手,並非一朝一夕,除非是天生武學奇才,但是這種人…萬中無一」這道理放在C語言學習上也一併受用
  • 為什麼有人說指針是 C 語言的精髓?
    其他高級語言都是把這塊基本屏蔽掉了,不在讓程式設計師直接操作指針,這裡不直接操作指的是不讓程式設計師用指針進行運算和強轉而不是徹底沒有了。 繼續說為什麼學習指針,為什麼學習指針就必須要說到指針的優點了。 a、指針可以直接操作變量地址,所以很靈活。 b、指針操作會減少很多變量的拷貝使得程序性能提升。 c、可以動態分配內存。
  • C語言函數指針之回調函數
    如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。2 為什麼要用回調函數?
  • C語言是C++的母語,萬變不離指針,指針是C語言的一大法寶!
    我們都知道C語言是一門過程性語言,所謂過程性就是在解決問題時,將問題按步驟分解。 例如,做菜的時候,先點火,再倒油,接著下菜翻炒,最後加鹽和醬油。但有時候借鑑面向對象的思想來組織代碼,邏輯層次會更加清晰。
  • 深入淺出剖析C語言函數指針與回調函數(一)
    百度的權威解釋如下:回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
  • C語言:數組和指針
    數組運行指針(Pointer)指針變量保存的是數據存儲的地址。'*'間接引用,『*』的優先級小於『[]』。c是指針數組,int *a[3],[]符號優先級高,先看a[3]是數組,int *整形指針;d是數組指針,int (*a)[3],()符號優先級高,(*a)是指針,指向有三個元素的整形一維數組;e是指向可變長度數組的指針,int (*a)[](其實和d一樣,在二維數組可以當做行指針
  • 入門C語言中的數組,字符串常量與指針
    int q[3] = {1, 2, 3};要聲明對另一個文件中定義的數組的外部引用,請使用extern int a[];字符串常量在C語言中,類型數組char用於表示字符串,字符串的結尾由設置為0的字節標記(也稱為NUL字符)以下定義都將其數組設置為相同的值
  • C語言的那些小秘密之函數指針
    我們經常會聽到這樣的說法,不懂得函數指針就不是真正的C語言高手。我們不管這句話對與否,但是它都從側面反應出了函數指針的重要性,所以我們還是有必要掌握對函數指針的使用。先來看看函數指針的定義吧。本文引用地址:http://www.eepw.com.cn/article/270442.htm  函數是由執行語句組成的指令序列或者代碼,這些代碼的有序集合根據其大小被分配到一定的內存空間中,這一片內存空間的起始地址就成為函數的地址,不同的函數有不同的函數地址,編譯器通過函數名來索引函數的入口地址,為了方便操作類型屬性相同的函數,c/c++引入了函數指針,函數指針就是指向代碼入口地址的指針
  • 「C語言指針」指針數組?數組指針?
    有些同學在在初學C語言時候喜歡鑽牛角尖,這種喜歡鑽研的精神值得肯定,但有時候反而就是因為這樣錯過了更精更深的知識點。今天帶著大家來簡單過一下數組指針和指針數組,這兩兄弟像是兩座大山,重重地壓在很多小白的心頭上。
  • 單片機c語言教程:C51運算符和表達式(指針和地址運算符)
    指針是單片機C語言中一個十分重要的概念,也是學習單片機C語言中的一個難點。對於指針將會在第九課中做詳細的講解。在這裡我們先來了解一下單片機C語言中供給的兩個專門用於指針和地址的運算符:本文引用地址:http://www.eepw.com.cn/article/170885.htm* 取內容 取地址取內容和地址的一般形式分別為:變量 = * 指針變量 指針變量 = 目標變量
  • 嵌入式系統高級C語言編程
    內容簡介  《嵌入式系統高級C語言編程》將主要介紹針對嵌入式系統的基於C語言的軟體項目開發的流程,較為複雜的c語言編程知識和技巧,編程風格和調試習慣
  • C語言—什麼是指針
    今天,小編我們來了解了解什麼是指針,為什麼小編我沒有直接的講指針那,那是因為指針是C語言中比較難的一個知識點,首先我們必須要了解它,熟悉它,之後我們才能進一步去學習,精通。好了,多餘的話,我就不說了我們開始。