Linux C 深入分析結構體指標的定義與引用

2021-07-09 02:57:14 字數 3829 閱讀 7858

關於結構體的基礎知識,網上書上都一大堆,這裡就不贅述了,下面我們要學習的是結構體指標。

#include #include #include struct man

;int main()

fs@ubuntu:~/qiang/struct$ gcc -o struct4 struct4.c

struct4.c: in function 『main』:

struct4.c:13:9: error: incompatible types when assigning to type 『char[10]』 from type 『char *』

fs@ubuntu:~/qiang/struct$

13行報錯,就是賦值那行,報錯原因是「字元分配的型別是不相容的型別」

我們看看這句n.name = "qiang",右邊是字串常量,這裡其實是字串的首位址,就是乙個位址,我們以前 char a = "qiang"沒錯啊,為什麼這裡報錯了,我們看看左值,n.name, name 是陣列名,是代表陣列的首位址啊,但是我們要記住,這裡name是個位址常量,是不能給常量賦值的,所以會報錯,那我們如何給乙個結構體中的字元陣列賦值呢?我們這裡用strcpy(n.name,"qiang") ! 當然我們n.name[1] = 'q',這樣是可以的。

下面開始講結構體指標:

一、指向結構體型別變數的使用

首先讓我們定義結構體:

struct stu

;

再定義指向結構體型別變數的指標變數:

struct stu *p1, *p2 ;

定義指標變數p1、p2,分別指向結構體型別變數。引用形式為:指標變數→成員;這裡我們要注意,非結構體指標引用型別是  結構體型別變數 . 成員;

下面我們看乙個例子:

對指向結構體型別變數的正確使用。

輸入乙個結構體型別變數的成員,並輸出:

#include #include struct data 

;struct stu

;int main()

執行結果如下:

fs@ubuntu:~/qiang/struct/tmp$ ./struct1

input name,number,year,month,day:

xiao

10086

2012

1222

outputname,number,year,month,day

xiao 10086 2012//12//22

fs@ubuntu:~/qiang/struct/tmp$

程式中使用結構體型別指標引用結構體變數的成員,需要通過c提供的函式malloc()來為指標分配安全的位址。函式sizeof()返回值是計算給定資料型別所佔記憶體的位元組數。指標所指各成員形式為:

student->name

student->num

student->birthday.year

student->birthday.month

student->birthday.day

二、指向結構體型別陣列的指標的使用

定義乙個結構體型別陣列,其陣列名是陣列的首位址,這一點前面的課程介紹得很清楚。

定義結構體型別的指標,既可以指向陣列的元素,也可以指向陣列,在使用時要加以區分。

上個例子中定義了結構體型別,根據此型別再定義結構體陣列及指向結構體型別的指標

struct data

;struct stu/*定義結構體*/

;

struct stustudent[4],*p;   /*定義結構體陣列及指向結構體型別的指標*/
使p=student,此時指標p就指向了結構體陣列student。

p是指向一維結構體陣列的指標,對陣列元素的引用可採用三種方法。

1)位址法

student+i和p+i均表示陣列第i個元素的位址,陣列元素各成員的引用形式為:

(student+i)->name、(student+i)->num和(p+i)->name、(p+i)->num等。student+i和p+i與&student[i]意義相同。

2)指標法

若p指向陣列的某乙個元素,則p++就指向其後續元素。

3)指標的陣列表示法

若p=student,我們說指標p指向陣列student,p[i]表示陣列的第i個元素,其效果與student[i]等同。對數組成員的引用描述為:p[i].name、p[i].num等

指向結構體陣列的指標變數的使用

#include #include struct data/*定義結構體型別*/

;struct stu/*定義結構體型別*/

;int main()

,, ,};

/*定義結構體陣列並初始化*/

p = student;/*將陣列的首位址賦值給指標p,p指向了一維陣列student*/

printf("outputname,number,year,month,day\n");

for(i = 0;i < 4;i++)/*採用指標法輸出陣列元素的各成員*/

printf("%8s %6ld %d//%d//%d\n",(p+i)->name,(p+i)->num,

(p+i)->birthday.year,(p+i)->birthday.month,

(p+i)->birthday.day);

return 0;

}

執行結果如下:

fs@ubuntu:~/qiang/struct/tmp$ ./struct2

outputname,number,year,month,day

liying 1 1978//5//23

wangping 2 1979//3//14

libo 3 1980//5//6

xuyan 4 1980//4//21

fs@ubuntu:~/qiang/struct/tmp$

寫出乙個模擬時鐘程式

分析:我們知道時間有時 分 秒 組成,這裡用結構體表示

**如下:

#include #include #include #include typedef struct clock

clock;

update(clock *p)

if(p->minute == 60)

if(p->hour == 24)

p->hour = 0;

}display(clock *p)

int main()

free(clock);

return 0;

}

執行結果如下:

fs@ubuntu:~/qiang/struct$ ./clock

00:00:01

fs@ubuntu:~/qiang/struct$ ./clock

00:00:55

這裡是個動態效果,大家可以列印出來看一下

指標深入分析

指標學習資料 zollty 2009 1.指向普通變數或者某個數或者字串。例如 int j,a 10 int pointer 1,pointer 2 pointer 1 j pointer 2 a 7 2.指標作為函式引數。例如 主函式部分 pointer 1 a pointer 2 b if a ...

C語言指標深入分析

指標是c語言的精髓,也是c語言的難點,一起加油鴨!參考c語言指標詳解 經典,非常詳細 指標本質上就是乙個位址,占用的儲存空間固定,一般為四個位元組。很重要的一點是指標指向的只是資料的首位址,那麼計算機如何知道這個資料具體有多長呢?答案是通過指標的型別來確定。換句話說,指標的型別的作用就是告訴計算機取...

深入分析C 引用 指標常量

引言 我選擇寫 c 中的引用是因為我感覺大多數人誤解了引用。而我之所以有這個感受是因為我主持過很多 c 的面試,並且我很少從面試者中得到關於 c 引用的正確答案。那麼 c 中引用到底意味這什麼呢?通常乙個引用讓人想到是變數的別名,而我討厭將 c 中引用定義為變數的別名。這篇文章中,我將盡量解釋清楚,...