C语言指针和结构体
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
c 语言归纳
结构体
1.结构体类型定义
#definen STUDENT struct student
student
{ int nun ;
char name[20] ;
char sex ;
int age ;
float score ;
char addr[30];
};
2.结构体变量定义
方式一: STUDENT student1 ,student2;
方式二: struct student
{ int nun ;
char name[20] ;
char sex ;
int age ;
float score ;
char addr[30];
} student1 ,student2 ;
3.结构体类型变量的引用
错误方式:printf(“%d %s %c %d %f %s\n”,student1) ;
正确方式: ①结构体变量名.成员名②(*p)->成员名③p->成员名
例:student1.num=1001 ;
4.结构体变量初始化
main()
{ struct student
{int num ;
char name[20] ;
char sex ;
char addr[30];
} a={ 89031 ,”li xiao” ,’m’ ,”101 beijing road “};
printf(“no:%ld\n name:%s\n sex:%c\n address:%s\n”,a.num,,a.sex,a.addr);
5.用typedef定义类型
typedef 已有类型新定义类型
例:typedef int COUNT ;
typedef student STD ;
指针
直接访问:按变量地址存取变量的方法;
间接访问:变量地址存放在另一个内存单元中;
指针:即一个变量的地址;
指针变量:一个专门存放另一个变量地址;
定义方法:
int i , j ;
int *pointer1 , *porinter2;
指针变量赋值: pointer1=&I ; pointer2=&j ;
值
3
地址2000
3
地址:2000
指针变量引用:
(1)&取地址运算符例&a为变量a的地址
(2)*指针运算符(间接访问)例*p为指针变量p所指向的变量
*&a=a ( *poinrer1) ++ 相当于a++
指针运算用于数组
p=&a[0] 指向数组第一个元素
p=a 同上;
定义时int *p=a;
“数组的指针”是指数组的起始地址;
“数组元素的指针”是指数组元素的地址;
C语言规定p+1就是指向数组下一个元素
(1)p+I ;a+I 就是a[I]的地址,指向a数组第I个元素
(2)* (p+I) 或* (a+I),是p+I或a+I 指向的数组元素a[I](其中a为数组a的首地址)
(3)指向数组的指针变量也可以带下标,如p[I]等价于* (p+I)
引用数组元素的方法
下标法: a[I] 指针法: * (a+I) 或* (p+I)
(a)* (p++) 先取*p值再指针p+1
(b)* (++p) 先使指针p+1,再取*p的值
例p初值为a ; (a)语句得a[0]的值; (b)语句得a[1]的值
(c) (*p)++表示p指向元素值+1 ( 即a[0]++ 如a[0]=3则a[0]=4)
(d)*(p--)相当于a[I - -] ,先取p值作”*”运算,再p自减1
(e)*(++p)=a[++I ]即先p自加1 ,再作*运算
指针小结
定义int I 定义整型变量I ;
int *p p为指向整型数据的指针变量
int a[n] 定义整型数组a有个n元素;
int *p[n] 定义指针数组p,它由n个指向整型数据的指针元素组成
int (*p)[n] p为指向含有n个元素的一维数组的指针变量;
int f( ) f 为带回整型函数数值的函数
int *p( ) p为指向一个指针的函数,该指针指向整型数据
int **p p是指针变量,它指向一个指向整型数据的指针变量;
int (*p)( ) p为指向函数的指针,该函数返回一个整型值
main()
{ int max(int , int );
int (*p) ( ) /*指向函数的指针变量*/
int a,b,c ;
p=max; /*P指向max函数入口地址*/
scanf(“%d %d “,&a,&b);
c= (*p)(a , b); /*相当于c=max(a , b ) ;
printf(“%d,%d,%d”, a , b , c) ; /*请问printf(“%d,%d,%d”, a , b ,max) ; (错) } printf(“%d,%d,%d”, a , b ,*p) ; (错)
printf(“%d,%d,%d”, a , b ,max(a,b)) ;对
printf(“%d,%d,%d”, a , b ,(*p)( ) ) ; 对*/ max( int x, int y)
{ int z ;
if (x>y) z=x;
else z=y;
return (z);
}
指针变量常用运算: p++ ,p—p+I , p-I , p - = I
指针变量赋值:
p=&a 将变量a的地址赋给p
p=array 将数组array首地址赋给p
p=&array[I] 将数组array第i个元素地址赋给p
p=max max 为已定义函数,将max的入口地址送给p
p1=p2 指针变量传递
注意: p=1000(错) I=p (错)
#define NULL 0
p=NULL (对的)
指针变量相减
例p1指向a[1] ; p2指向a[4] 而p2-p1=4-1=3表示两指针间元素个数
指针变量相加:无意义
宏定义
不带参数的宏定义(指定一个名字,来代表一个字符串)
#define 标识符字符串例#define PI 3.1415169
#undef 标识符; 结束宏定义作用域
带参数的宏定义
格式: #define 宏名(参数表) 字符串
例#define S( a,b) a*b
arae =S(3,2) 即: area=3*2
一般用宏代表简短表达式:
#define MAX(x,y) (x)>(y)?(x) : (y)
main()
{ int a , b , c , d , t ;