關於結構體的基礎知識,網上書上都一大堆,這裡就不贅述了,下面我們要學習的是結構體指標。
#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 中引用定義為變數的別名。這篇文章中,我將盡量解釋清楚,...