指向結構體的指針

2021-02-19 電子愛好者

在C語言中幾乎可以創建指向任何類型的指針,包括用戶自定義的類型。創建結構體指針是極常見的。下面是一個例子:

typedef struct{ char name[21]; char city[21]; char state[3];} Rec;typedef Rec *RecPointer;RecPointer r;r=(RecPointer)malloc(sizeof(Rec));



r是一個指向結構體的指針。請注意,因為r是一個指針,所以像其他指針一樣佔用4個字節的內存。而malloc語句會從堆上分配45位元組的內存。*r是一個結構體,像任何其他Rec類型的結構體一樣。下面的代碼顯示了這個指針變量的典型用法:

strcpy((*r).name, "Leigh");strcpy((*r).city, "Raleigh");strcpy((*r).state, "NC");printf("%sn", (*r).city);free(r);

您可以像對待一個普通結構體變量那樣對待*r,但在遇到C的操作符優先級問題時要小心。如果去掉*r兩邊的括號則代碼將無法編譯,因為「.」操作符的優先級高於「*」操作符。使用結構體指針時不斷地輸入括號是令人厭煩的,為此C語言引入了一種簡記法達到相同的目的:

strcpy(r->name, "Leigh");

r->這種寫法和(*r).是完全等效的,但是省去了兩個字符。

指向數組的指針
還可以創建指向數組的指針,如下所示:

int *p; int i; p=(int *)malloc(sizeof(int[10])); for (i=0; i<10; i++) p[i]=0; free(p);

或:

int *p; int i; p=(int *)malloc(sizeof(int[10])); for (i=0; i<10; i++) *(p+i)=0; free(p);



可見要創建指向整數數組的指針,只需創建一個普通的整數指針即可。調用malloc分配合適的數組空間,然後將指針指向數組的第一個元素。訪問數組元素既可以用普通的數組下標也可以用指針運算。C將兩種方法視為是等效的。

指向數組的指針這一技巧尤其適用於字符串。您可以為某個特定大小的字符串分配剛好合適的內存。

指針數組
有時聲明一 個指針數組可以節省大量內存,或者使得某些內存消耗較大的問題得以解決。下面例子中的代碼,聲明了一個由10個結構體指針組成的數組,而不是一個結構體數組。否則這個結構體數組將佔用243 * 10=2,430位元組的內存。使用指針數組可以最大限度減小內存消耗,直到用malloc語句為記錄實際分配內存空間。作為此過程的演示,下面的代碼只為一個記錄分配空間,保存某個值後又將空間釋放:

定義一個結構體類型數組,其數組名是數組的首地址,這一點前面的課程介紹得很清楚。
定義結構體類型的指針,既可以指向數組的元素,也可以指向數組,在使用時要加以區分。

typedef struct { char s1[81]; char s2[81]; char s3[81]; } Rec; Rec *a[10]; a[0]=(Rec *)malloc(sizeof(Rec)); strcpy(a[0]->s1, "hello"); free(a[0]);


包含指針的結構體
結構體可以包含指針,如下所示:

typedef struct { char name[21]; char city[21]; char phone[21]; char *comment; } Addr; Addr s; char comm[100]; gets(s.name, 20); gets(s.city, 20); gets(s.phone, 20); gets(comm, 100); s.comment= (char *)malloc(sizeof(char[strlen(comm)+1])); strcpy(s.comment, comm);

只有當評論框裡包含有評論的記錄時,這一技巧才是有用的。如果沒有評論記錄,評論框裡只包含一個指針(4個字節)。包含評論的記錄會分配恰到好處的空間,保存評論的的字符串,這取決於用戶輸入的字符串的長度。

相關焦點

  • 9.3 結構體指針
    (1)通過指向結構體變量的指針輸出結構體變量中的成員信息#include<stdio.h>//指向結構體變量的指針
  • 快速上手系列-C語言之結構體(二)結構體數組與結構體指針
    結構體數組對於結構體數組,我們先回想一下整型數組,然後舉例我們要統計咱們班30個人的姓名,學號 ,成績,如果我們用結構體變量來實現是不現實的。那麼我們就準備用結構體數組來完成這事。結構體數組就是同一類型的結構體變量的集合,內存分布上是連續的。
  • c語言定義結構體指針
    ]={{0,1,2,3,4,(*main)},{6,7,8,9,10,11},{0,1,2,3,4,5},{0,1,2,3,4,5},};const KbdTabStruct KBD1={20,27,38,39,40,51,}; KbdTabStruct *ptr=&KBD[1];//定義指向結構體的指針變量
  • ...也可以面向對象面層,使用「函數指針結構體」為C語言找個「對象」
    函數指針結構體稍微思考一下,應該能夠想到C語言中的普通數據類型不僅可以用於定義數組,還可以用來定義結構體,例如:struct cn{char c;int i;double d;};那麼可以看作「普通數據類型」的函數指針也可以定義結構體嗎?
  • 指針指針
    a,這個指針指向的就是傳進函數內a的地址。地址b的解引用*b也只是保存了局部變量c的值而已,並未重新指向其它地址,同時形參a也獲取了*b的值,同時指針a仍然指向b,即使函數中未寫*a = *b,輸出結果仍然是3, 3。指針的使用指針從它的名字的含義可以看出它需要指向某個事物,這個事物可以看成是變量的地址。
  • C語言的指針,簡介
    所以在java的JNI庫裡,如果需要把native層的C結構體的指針保存到java層,一般是定義一個long類型的變量。指針指向的變量,可以是普通變量、數組變量、結構體變量,以及數組元素、結構體的成員變量,還可以是指針變量。指針還可以指向函數,叫做函數指針。
  • 「C語言指針」起別名關鍵字typedef和結構體類型的恩怨情仇
    在上一篇文章中,我們簡要了解了鍊表的前導知識——結構體和它的眾多小細節。其中提到了起別名關鍵字typedef,在那裡我們只是簡單介紹過:在實際工作中,程式設計師們普遍使用它,但是並未展開去講細節。所以本文決定沿襲上一篇文章的思路,結合一些程序實例,細緻地展開討論typedef和結構體相碰產生的奇妙反應。
  • C語言中的結構體和聯合體
    結構體與指針一個結構體變量的指針就是該變量所佔據的內存段的起始地址。可以設一個指針變量,用來指向一個結構體變量,此時該指針變量的值是結構體變量的起始地址。指針變量也可以用來指向結構體數組中的元素。結構體指針使用場景(1)函數參數:用指向結構體變量(或數組)的指針作實參,將結構體變量(或數組)的地址傳給形參。
  • C語言系列(九):結構體
    類型n 成員名n;};其中,struct是定義結構體類型的關鍵字;結構體類型名必須是合法的C標識符,與其前面的struct一起共同構成結構體類型名;花括號內的內容是結構體類型所包括的結構體成員,也稱為結構體分量。
  • C 語言中的結構體和共用體(聯合體)
    結構體與指針一個結構體變量的指針就是該變量所佔據的內存段的起始地址。可以設一個指針變量,用來指向一個結構體變量,此時該指針變量的值是結構體變量的起始地址。指針變量也可以用來指向結構體數組中的元素。結構體指針使用場景(1)函數參數:用指向結構體變量(或數組)的指針作實參,將結構體變量(或數組)的地址傳給形參。
  • C語言中的結構體和共用體(聯合體)
    結構體與指針一個結構體變量的指針就是該變量所佔據的內存段的起始地址。可以設一個指針變量,用來指向一個結構體變量,此時該指針變量的值是結構體變量的起始地址。指針變量也可以用來指向結構體數組中的元素。結構體指針使用場景(1)函數參數:用指向結構體變量(或數組)的指針作實參,將結構體變量(或數組)的地址傳給形參。
  • C語言 | 指向指針的指針
    例82:C語言用指向指針的指針的方法對n個整數排序並輸出;要求將排序單獨寫成一個函數;n個整數在主函數中輸入,最後在主函數中輸出。 解題思路:讀者看著道題的時候,首先要觀察一下有什麼規律,然後指向指針的指針在上一道練習題中已經有了鋪墊,讀者可以聯繫上一道題去熟練使用指向指針的指針。
  • C語言結構體(struct)詳解
    (說後邊是個指針吧?指針也佔長度!這個是不佔的!原理很簡單,這個東西完全是數組後邊的尾巴,malloc開闢的是一片連續空間。其實這不應該算一個機制,感覺應該更像一個技巧吧)補充非彈性數組不能用"char a[]"這種形式定義彈性(flexible)變量,必須明確大小。
  • C語言編程 — 結構體與位域
    ,也可以包含指向自己結構體類型的指針,這種指針的應用通常是為了實現一些更高級的數據結構如鍊表和樹等。title, "C Programming");    strcpy(book1.author, "Nuha Ali");    strcpy(book1.subject, "C Programming Tutorial");    book1.id = 123;    printBook(book1);    return 0;}指向結構體變量的指針
  • 指針、結構體、編譯預處理和文件
    指針的意思就是存儲數據在內存中的地址信息的變量,很饒口是不是,簡單翻譯一下,信息都是存儲在內存中以字節為單位的格子裡的,每個格子都有一個編號,比如1號格子,2號格子等等,這個編號就是數據的地址,比如我們設置一個變量是X,那這個X現在可能是7,經過運算之後可能變成67,如果設置的Y是X的指針,則Y的第一個值就是7在內存裡面的地址編號,比如1號格子就是1,當X變成67了,可能Y就是67在內存格子裡面的存儲地址
  • Python使用ctypes模塊調用DLL函數之傳遞結構體參數
    上篇已經講了傳遞數值、指針、字符串參數的例子,詳細細節請參考:這次講一下在Python中使用ctypes模塊調用DLL中的庫函數傳遞結構體參數的情況。同樣,作業系統環境是win7 64位,Python使用的版本是python2.7.14,函數約定的調用方式為C調用(cdecl)方式。
  • C語言程序中,有些函數的參數是結構體指針型,為什麼要這麼用?
    在C語言程序開發中,遇到複雜問題需要描述時,最常使用的就是結構體了。事實上,如果某個函數的參數比較多,並且這些參數被使用的頻率比較高,為了C語言代碼的簡潔,也常將這些參數封裝為結構體。修改後的C語言代碼明顯精簡多了修改後的C語言代碼明顯精簡多了,在函數內部,視頻的各個信息可以通過結構體指針 vinfo 訪問,例如:
  • C語言是C++的母語,萬變不離指針,指針是C語言的一大法寶!
    但C的結構體做不到。 在C++裡頭,父親的私有成員,兒子是無法訪問的。結構體嵌套也做不到。因為結構體根本就沒有訪問控制的概念。 對於C++而言,訪問控制實質上是在編譯層做的,我們仍舊可以通過指針來間接訪問。 例如:
  • C/C++ 語言指針詳解(一)
    (7)如果指針沒有賦初值,那麼在通過使用指針間接它所指向的變量前,一定要賦值,這樣也很好理解,指針沒有指向變量,怎麼能間接訪問這個變量的數據值呢?因此說使用指向前,指針不能為空 。>//函數的返回值是指針,是指向整型變量的指針8)int **pp;//pp是一個指向指針的指針,即二級指針。
  • C語言結構體、枚舉以及位域的講解
    結構體指針可以設定一個指針變量用來指向一個結構體變量。此時該指針變量的值是結構體變量的起始地址,該指針稱為結構體指針。 結構體指針與前面介紹的各種指針變量在特性和方法上是相同的。與前述相同,在程序中結構體指針也是通過訪問目標運算「*」訪問它的對象。