a10 void swap main int a b b8
[例] 交换两数。 指针变量 变量 a=10 void swap( ); main( ) {int a, b; b=8 scanf(%d%d”, &a, &b); swap(&a, &b); printf(“%d, %d”, a, b); p 1=&a=2000 H } void swap( int *p 1, int *p 2) {int t; p 2=&b=2 EA 0 H t=*p 1, *p 1=*p 2, *p 2=t ; } 内存 10 地址 2000 H 2001 H : 8 2 EA 0 H 2 EA 1 H : 2000 H 3101 H : 2 EA 0 H 3802 H 3803 H
五、 结构体类型的指针 • 指向结构体类型变量的指针 指向结构体类变量的指针就是该变量所占用的内存区段的首址。 [例] struct student p { int num; num char name[3]; char sex; name float score; st 1 } st 1, st 2, st 3; sex struct student *p=&st 1; printf(“%d, %s”, st 1. num, st 2. name); score printf(“%d, %s”, (*p). num, (*p). name); printf(“%d, %s”, p->num, p->name); : : 2 A 00 H
• 指向结构体类型数组的指针 指向结构体类数组的指针就是该数组所占用的内存区段的首 址。 [例] struct student { int num; : char name[3]; p 2 A 00 H st[0] char sex; float score; 2 A 0 AH st[1] } st[30]={……}; 2 A 14 H struct student *p=st; st[2] for(p=st; p<st+30; p++) 2 AE 0 H st[3] printf(“%d, %s, %c, %5. 1 fn”, : p->num, p->name, p->sex, p->score); :
(2) 链表的遍历(输出) 函数如下: void print(head) struct node *head; { struct node *p; printf("n The table is: n"); p=head; /*以表尾结点中指针为NULL做为遍历结束的标志*/ while(p!=NULL) { printf("%4 d--%7. 2 f", p->num,p->s); p=p->next; /* 移向下一个结点*/ } } (link_t. c)
链表 • 插入结点 单向链表 2010 h 2050 h 2100 h 2 a 02 h 2050 h 2100 h 2180 h 2 a 02 h 0 2180 h 2100 h • 删除结点 单向链表 11/27/2020 2010 h 2050 h 2100 h 2 a 02 h 0
# include "stdio. h" int add(n) int n; { int sum=1, i; for(i=1; i<=n; i++) sum=sum*i; return(sum); } main() { int n, m, (*p)(); printf("input n: n"); scanf("%d", &n); 赋值 p=add; m=(*p)(n); printf("n!=%dn", m); } 调用
[例] 编写一个简单的帐单系统,包括:录入、删除、显示 帐目、退出功能,各功能项所对应的实现函数分别为 enter()、delete()、review()、quit()。 # include "stdio. h” int enter(), delete(), review(), quit(); main() { int i; int (*p)(); i=menu(); switch(i) { case 1: p=enter; break; case 2: p=delete; break; case 3: p=review; break; case 4: p=quit; break; } process(p); }
menu() { char ch; do { printf("1. entern"); printf("2. Deleten"); printf("3. Reviewn"); printf("4. Quitn"); printf("Select a number: "); ch=getche(); printf("n"); }while(!strchr("1234", ch)); return(ch-48); }
process(int (*f)()) { (*f)(); } enter() { printf("In enter!n"); } delete() { printf("In deleten"); } review() { printf("In review!n"); } quit() { printf("In quit!n"); }
main() { char *strchr( ); char *pt, ch, line[]="I love china. "; printf("please input char: n"); scanf("%c", &ch); /* 输入要查找的字符*/ pt=strchr(line, ch); /*调用函数查找指定字符,将返回的地址值赋给指针变量 pt*/ printf("nstring starts at address %x. n", line); /* 输出本字符串的首地址*/ printf("First occurrence of char %c is address %x. n", ch, pt); /*输出找到字符的地址,地址都用十六进制表示*/ printf("This is position %d (starting from 0)n", ptline); /*输出找到字符的相对于首地址的偏移位置*/ }
[例2] # include "stdio. h” main() { int **k, *j, i=100; j=&i; k=&j; printf("%dn", **k); getch(); } 结果: 100
[例2]编写一个ren(换名)程序。 # include "dir. h” # include "string. h” int main(int argc, char *argv[]) { char oldname[MAXPATH], newname[MAXPATH]; if (argc>2) { strcpy(oldname, argv[1]); 定义在dir. h中 strcpy(newname, argv[2]); } else { printf("use: jc 12 oldname newnamen"); exit(1); 系统函数 } if (rename(oldname, newname)==0) { puts("successfuln"); exit(0); } else { printf("nerrorn"); exit(2); } return(0); } exren. c
[例1] main() { union { unsigned char c; unsigned int I[4]; }z; z. I[0]=65; z. I[1]=66; printf(“%cn”, z. c); } 结果:A 结果:
[例2] main() { union S->c[0] { int I[2]; long k; 0 1 char c[4]; 57 0 }r, *s=&r; 9 s->I[0]=0 x 39; s->[1]=0 x 38; S->I[0] printf(“%cn”, s->c[0]); } 结果: 9 2 3 56 0 8 S->I[1]
应用举例 [例1]main() { enum language {basic=3, assembly, ada=100, cobel, fortran 97}; enum language speak; speak=fortran 97; printf(“%dn”, speak); } 结果: 102
[例2] main() { enum team{my, your=4, his, her=his+10}; printf(“%d %dn”, my, your, his, her); } 结果: 0 4 5 15
main() { DATE max; printf(%dn”, sizeof(struct date)+sizeof(max)); } 结果: 30 [例2] typedef union { long x[2]; int y[4]; char z[8]; }MYTYPE; MYTYPE them; main() { printf(%dn”, sizeof(them)); } 结果: 8
位域的引用: struct packed_data {unsigned a: 2; unsigned b: 6; unsigned c: 4; unsigned d: 4; int i; }data; a 2 b 6 c d 4 4 i 16
例1:下列定义中的错误。 Struct twobyte { unsigned I: 3; unsigned j: 4; unsigned : 0; float k: 4; unsigned : 2 unsigned m: 18; }bit;
例2: main() { struct pp { unsigned i: 3; unsigned j: 4; unsigned k: 4; unsigned : 0; //下面将从下一字节开始分配 unsigned : 3; unsigned m: 6; }; union uu//长度为 4个字节 { struct pp bb; long int l; }u; u. l=0 x 12345678;
12 00010010 34 56 00110100 m 3 78 01010110 k 01111000 j i printf("%u, %u, %dn", u. bb. i, u. bb. j, u. bb. k, u. bb. m, sizeof(struct pp)); } 结果: 0,15,12,6,4
- Slides: 63