當前位置:首頁 » 密碼管理 » 指針訪問結構體

指針訪問結構體

發布時間: 2022-06-30 13:41:59

c語言指向結構體的指針


  1. C語言中的結構體
    在C語言中,結構體(struct)指的是一種數據結構,是C語言中聚合數據類型(aggregate data type)的一類。結構體可以被聲明為變數、指針或數組等,用以實現較復雜的數據結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問

  2. 定義與聲明
    結構體的定義如下所示,struct為結構體關鍵字,tag為結構體的標志,member-list為結構體成員列表,其必須列出其所有成員;variable-list為此結構體聲明的變數。

  3. 結構體成員的引用

    有兩種方式,英文的句點 . ,一個減號加一個大於號 ->。

    當結構體是一個指針時要引用結構體的成員就用-> 而如果不是指針就用.。

    如:
    struct msg_st {
    int a;
    };
    struct msg_st msg;
    struct msg_st *ms;
    msg.a = 10;
    ms->a = 20;




⑵ C語言結構體指針成員所指向的變數如何訪問

第一種寫法:

(*a).p=&b;

.的優先順序高於*,(*pointer)兩邊的括弧不能少。如果去掉括弧寫作*pointer.memberName,那麼就等效於*(pointer.memberName),這樣意義就完全不對了。

第二種寫法:

a->p=&b;

->是一個新的運算符,習慣稱它為「箭頭」,有了它,可以通過結構體指針直接取得結構體成員;這也是->在C語言中的唯一用途。

結構體是一種數據類型,是一種創建變數的模板,編譯器不會為它分配內存空間,就像 int、float、char 這些關鍵字本身不佔用內存一樣;結構體變數才包含實實在在的數據,才需要內存來存儲。下面的寫法是錯誤的,不可能去取一個結構體名的地址,也不能將它賦值給其他變數。

(2)指針訪問結構體擴展閱讀:

用指針引用結構體變數成員方式總結與技巧:

一、(*指針變數名).成員名

注意,*p 兩邊的括弧不可省略,因為成員運算符「.」的優先順序高於指針運算符「*」,所以如果 *p 兩邊的括弧省略的話,那麼 *p.num 就等價於 *(p.num) 了。

因為指針變數 p 指向的是結構體變數第一個成員的地址,即字元數組 name 的首地址,所以 p 和 (*p).name 是等價的。

「等價」僅僅是說它們表示的是同一個內存單元的地址,但它們的類型是不同的。指針變數 p 是 struct 型的,而 (*p).name 是 char* 型的。所以在 strcpy 中不能將 (*p).name 改成 p。用 %s 進行輸入或輸出時,輸入參數或輸出參數也只能寫成 (*p).name 而不能寫成 p。

二、直接用:指針變數名->成員名

來代替,它們是等價的。「->」是「指向結構體成員運算符」,它的優先順序同結構體成員運算符「.」一樣高。p->num 的含義是:指針變數 p 所指向的結構體變數中的 num 成員。p->num 最終代表的就是 num 這個成員中的內容。

⑶ 如何訪問結構體指針的結構體指針成員

1、該種方法用指針指向一個結構體,使用時p->成員名。

struct Studentp;

struct Student stu1={001,「zb」,90.5};

p=&stu1;

printf(「學號 姓名 分數 」);

printf("%d %s %0.1f ",p->num,p->name,p->score);*/

2、該種方法是定義一個指針變數,只指向一個struct Student的結構體

struct Student* p;

struct Student stu={001,"zhao",90.5};

p=&stu;

printf("學號 姓名 分數 ");

printf("%d %s %0.1f ",(*p).num,(*p).name,(*p).score);*/

(3)指針訪問結構體擴展閱讀

指向結構體變數的指針

除了通過「結構體變數名.成員名」的方式引用結構體變數中的成員,除了這種方法之外還可以使用指針。&student1 表示結構體變數 student1 的首地址,即 student1 第一個項的地址。如果定義一個指針變數 p 指向這個地址的話,p 就可以指向結構體變數 student1 中的任意一個成員。

用指針引用結構體變數成員的方式是:(*指針變數名).成員名

注意,*p 兩邊的括弧不可省略,因為成員運算符「.」的優先順序高於指針運算符「*」,所以如果 *p 兩邊的括弧省略的話,那麼 *p.num 就等價於 *(p.num) 了。

從該程序也可以看出:因為指針變數 p 指向的是結構體變數 student1 第一個成員的地址,即字元數組 name 的首地址,所以 p 和 (*p).name 是等價的。

但是,「等價」僅僅是說它們表示的是同一個內存單元的地址,但它們的類型是不同的。指針變數 p 是 struct STUDENT* 型的,而 (*p).name 是 char* 型的。所以在 strcpy 中不能將 (*p).name 改成 p。用 %s 進行輸入或輸出時,輸入參數或輸出參數也只能寫成 (*p).name 而不能寫成 p。

⑷ 我想問一下怎麼訪問結構體指針變數這個成員謝謝!

最後一句定義了一個stu格式的指針,也就是結構體指針next不是*next

數據類型是 struct stu *,C裡面把碰到多字元的數據類型把*寫到後面了。

所以next指向一個struct stu的結構體,這就是鏈表的定義。關於訪問問題我寫了段程序。

這段程序定義了兩種不同的結構體參數申明,begin是直接聲明了一個結構體,這種用法調用的話begin是一個結構體的變數,所以使用begin.next調用,如果是list end這樣定義個結構體的指針,也可操作結構體,但是最好先malloc開辟一個空間,然後就使用->方式調用,不知道明白了么

⑸ 【請教】c語言里指針訪問結構體變數的問題

#include <stdio.h>
int main() {
struct my {
int a;
int b;
int c;
};
struct my ss= {1,2,3};
struct my *ptr=&ss; //此處
printf("%d\n",ptr->a);
return 0;
}

⑹ 如何用二級指針訪問結構體成員

對於字元串正確的做法是這樣:strcpy(pnew->name, "灰太狼");如果是結構中的數組,則應該用memcpy函數幅值。把分交出來吧

⑺ 舉例說明如何利用指針訪問結構體中的每一個成員變數


最簡單的方法是在CMainForm中定義一個ball的變數,這樣只需要在CMainForm的函數中向線程傳遞this指針,通過this指針訪問balll的變數,進而訪問ball的成員函數.
使用這種方法也就不需要定義新的結構體了 struct XXX ;XXX A.

⑻ 指向結構體的二級指針怎麼訪問結構體成員

假設b是一個二級指針,那麼*b就是b指向的內容,也就是一個一級指針,而一級指針訪問成員是->連起來就是(*b)->sth

⑼ C語言關於指針訪問結構體數據的使用

呵呵,很簡單,你只要把x堪稱一塊內存就可以了。

x相當於:

+---------------------------+

|1|2|3|4|1|2|3|4|5|6|7|8|9|a|

+---------------------------+

|---n---|---------str-------|

我們從圖中可以看到n其實佔了四個位元組的內存,而str佔了10個位元組。

那麼str[5]相當於從頭開始算跳過了九個位元組,那麼p[9]就是正好是str[5]的地方,也可以*(p+9)形象的說明了跳過了9個位元組。

⑽ 指向結構體的指針應該怎麼理解

當一個指針變數指向結構體時,我們就稱它為結構體指針。注意,結構體變數名和數組名不同,數組名在表達式中會被轉換為數組指針,而結構體變數名不會,無論在任何錶達式中它表示的都是整個集合本身,要想取得結構體變數的地址,必須在前面加&,所以給 pstu 賦值只能寫作:

struct stu *pstu = &stu1;

而不能寫作:

struct stu *pstu = stu1;

還應該注意,結構體和結構體變數是兩個不同的概念:結構體是一種數據類型,是一種創建變數的模板,編譯器不會為它分配內存空間,就像 int、float、char 這些關鍵字本身不佔用內存一樣;結構體變數才包含實實在在的數據,才需要內存來存儲。

下面的寫法是錯誤的,不可能去取一個結構體名的地址,也不能將它賦值給其他變數:

struct stu *pstu = &stu;

struct stu *pstu = stu;

(10)指針訪問結構體擴展閱讀

結構體指針作為函數參數

結構體變數名代表的是整個集合本身,作為函數參數時傳遞的整個集合,也就是所有成員,而不是像數組一樣被編譯器轉換成一個指針。

如果結構體成員較多,尤其是成員為數組時,傳送的時間和空間開銷會很大,影響程序的運行效率。所以最好的辦法就是使用結構體指針,這時由實參傳向形參的只是一個地址,非常快速。

調用中採用的結構體變數。在傳入函數時通過指針void *para指針傳遞過去。需要注意的是不能直接使用para->a來訪問結構體的成員。

這是因為para只是接收過來的地址。para雖然指向的結構體的首地址。但是這個指針並不知道自己指向的是什麼內容和有多少成員。需要(date *)para強制轉化一下。這樣para就可以知道自己是什麼類型的指針。有多少成員。

熱點內容
sql2008鏈接伺服器 發布:2025-07-19 16:23:47 瀏覽:845
香港阿里騰訊雲伺服器報價 發布:2025-07-19 16:18:52 瀏覽:415
日語翻譯存儲安全 發布:2025-07-19 16:18:09 瀏覽:209
虛擬機訪問主機ip 發布:2025-07-19 16:16:37 瀏覽:998
dz手機源碼 發布:2025-07-19 16:14:50 瀏覽:703
如何利用伺服器掛機器人 發布:2025-07-19 16:13:35 瀏覽:531
解壓縮已 發布:2025-07-19 16:02:46 瀏覽:580
預處理編譯鏈接 發布:2025-07-19 15:59:03 瀏覽:874
文件夾無限打開 發布:2025-07-19 15:57:01 瀏覽:277
研究生復試需要什麼配置的電腦 發布:2025-07-19 15:42:21 瀏覽:966