C語言的指針,簡介

2020-12-04 閒聊代碼

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

指針的字節數,與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語言陷阱與技巧31節,都說void*指針是「萬能指針」,它萬能在哪
    ,不過不知道讀者注意到沒,有些庫函數的參數是 void * 類型的,例如:void *memcpy(void *dest, constvoid *src, size_t n);void *memmove(void *dest, constvoid *src, size_t n);前面的章節在討論C語言指針時,提到指針從某種程度上來說,
  • C語言中的「不透明」指針是什麼,它有什麼用呢?
    雖說指針是C語言中比較複雜的語法,但是確實非常好用,因此我寫過不少文章討論C語言中的指針,相信對初學者理解指針有一定的幫助。事實上,的確有讀者私信我說看了這些文章,「總算不再畏懼指針了」。不過他同時也問了一個問題:C語言有「不透明指針(opaque pointer)」嗎?
  • 青少年信息學競賽Pascal語言:指針(十)
    合肥奧數網訊:合肥市青少年信息學競賽Pascal語言:指針   指針   指針是通過地址來訪問變量的一種特殊的數據類型,屬於動態的數據結構,它可以在需要時產生,用完後則又可以取消或回收,以減少佔用的內存空間。指針變量與其他類型的變量不同,它佔有的不是數據,而是地址。
  • C語言,局部變量的指針,棧幀
    C/C++不能返回局部變量的指針,是一條重要的語法規則。至於為什麼,則不是那麼顯眼。局部變量,是分配在棧上的變量,隨著函數調用的返回而失效。函數調用結束之後,局部變量的指針,也就是野指針了,不能在函數外繼續使用。
  • C語言|文件指針、fopen()、fscanf()、fclose()
    參數0表示程序正常結束,非0參數通常表示不正常的程序結束C語言允許同時打開多個文件,不同文件採用不同文件指針指示,但不允許同一個文件在關閉前被再次打開如圖所示,fgets()函數用來從文本文件中讀取字符串,調用格式為:fgets(s,n,fp);其中s可以是字符數組名或字符指針(指向字符串的指針),用該函數接收的字符串就放在s裡面n是指定讀入的字符個數
  • C語言編程:以實例教你學指向函數的指針
    指針是C語言的精髓,對於初學者來講,指針是C語言語法學習中比較難的知識點,而這裡面指向函數的指針更是不太容易理解。下面給大家講下怎樣學習理解C語言中指向函數的指針及編程方法和使用例子。注意:這是一篇關於C語言編程的基礎語法內容,C語言大神請繞過。
  • 第四篇:C語言中指針與字符串核心知識點梳理
    這就涉及到本文要講到的第一個核心概念:指針。重點包括:指針處理一維數組、動態內存分配等。C語言的基本數據類型中有一個char的關鍵詞,可以存儲單個的字符。那麼,像漢字以及由多個字符組成的內容,又該如何存儲呢?
  • C語言相關文件的基本知識
    用過計算機的人,對文件都不陌生,大多數人都接觸過,今天我們來講講關於C語言相關文件的基本知識。首先,我們先來了解了解什麼是文件。文件有不同的類型,在程序的設計中,主要有兩種文件; 1.程序文件;包括源程序文件(後綴為.c),目標文件(後綴為.obj),可執行文件(後綴為.exe)等,這類文件的內容是程序代碼。
  • C Primer Plus怎樣高效學?C語言大神案例值得借鑑!
    我們常常聽到有人爭論「Python、Java、PHP......是這個世界上最好的語言」,卻很少聽到有人誇讚C語言,為什麼呢?因為C語言實在是太太太太難了......為什麼這麼多人學不會C語言呢?因為很多人覺得用C語言作為入門語言覺得太難了,裡面還有指針,回調,遞歸之類的操作太難了。為什麼這麼多人覺得C語言難?
  • 「C語言從入門到入土」必備C語言基礎筆記整理
    一、C語言1、什麼是C語言?C語言是人寫機器看的一種語言。C語言是高級語言中的低級語言。C語言貼近硬體。C語言的入門學習比較簡單。彙編語言——>B語言——>C語言2、C語言的特性首先C語言就是你的女朋友。無論你讓它幹什麼,它絕對不會自己找到方法。
  • 自考「C語言程序設計」模擬試題九
    A.d&ef          B.6a            C.z4x5c           D.a3/b4  3.在C語言中,存儲一個字符型、整型、單精度實型變量所需的空間是()。  int  x;   char  y;   char  z[20];  A. scanf(「%d%c%c」,&x,&y,&z);     B. scanf(「%d%c%s」,&x,&y,&z);  C. scanf(「%d%c%c」,&x,&y,z);
  • 深入理解C語言
    導讀:Dennis Ritchie過世了,他發明了C語言,一個影響深遠並徹底改變世界的計算機語言。一門經歷40多年的到今天還長盛不訓的語言,今天很多語言都受到C的影響,C++,Java,C#,Perl,PHP,Javascript等等。但是,你對C了解嗎?相信你看過本站的《C語言的謎題》還有《誰說C語言很簡單?》。
  • ARM中ADS環境下C語言和彙編語言混合編程及示例
    下面是一個例子來說明如何在C中內嵌彙編語言  C語言文件.c httphi.baidu.comprocatlaw  #include stdio.h  void my_strcpy(const char src, char dest){  char ch;  __asm{  loop
  • C語言基礎教學檔案!編號零零肆
    C語言令牌每個C程序都是一組指令,每個指令都是一些單獨的單元的集合。每個最小的單個AC程序單元稱為令牌。AC程序(用來定義電腦程式的形式語言)中的每條指令都是令牌的集合。令牌用於構建c程序,它們被稱為AC程序的基本構建塊。
  • 2003年10月甘肅省高等教育自學考試C語言程序設計試卷
    ,且feof(fp)的返回值是非零值,則表示  ()  A已讀到此文件末尾 B未讀到此文件的末尾  C此文件已關閉 D此文件尚未被打開  8.以下c語言函數聲明中,不正確的是()  Avoid fun (int x, int y); Bfun (int x, int y);  Cint fun (int x,y);
  • C語言程序設計試題及答案
    A) 'a'&&'b' B) a<=b C) a||b+c&&b-c D) !((a<b)&&!c||1)14、設有數組定義:char array[]=「student」;則數組所佔的存貯空間為( )。
  • C語言基礎知識學習(一)
    標識符在程序中使用的變量名、函數名、數組名、指針名、標號等稱為標識符.原先的C89標準中只有32個關鍵字然後在1999年之後進行了兩次技術修正,新出臺了C99標準新增加了5個關鍵字 分別是:restrict, inline, _Complex, _Imaginary, _Boolb) 預定義標識符包括C語言提供的庫函數
  • C語言之const和volatile"究極"學習
    const只讀變量:const修飾的變量是只讀的,本質上還是變量const修飾的局部變量在棧上分配空間const修飾的全局變量在全局數據區分配空間const只在編譯期有用,在運行期沒有用註:const修飾的變量不是真的常量,它只是告訴編譯器該變量不能出現在賦值符號的左邊2、const全局變量的分歧:在現代c語言編譯器中
  • 51單片機基礎剖析(基於C語言)
    指針是C語言中的一個重要概念,使用也十分普遍,正確使用指針類型數據可以有效的表示複雜的數據結構,直接處理內存地址,而且可以更為有效的使用數組。 在C語言中,為了能夠實現直接對內存單元的操作,引入了指針類型的數據,指針類型數據是專門用來確定其它數據類型的地址的,因此一個變量的地址就被稱為該變量的指針如: 一個整形變量i 存放在內存單元40H中,則該內存單元地址40H就是變量i 的指針。
  • 計算機二級考試C語言高頻考點
    一,C語言概述C語言基礎知識1.C語言的構成(1)源程序由函數構成,每個函數完成相對獨立的功能(2)每個源程序中必須有且只能有一個主函數可以放在任何位置(2)源程序的擴展名為.c,目標程序的擴展名為.obi,可執行程序的擴展名為.exe。