Skip to content

指针和数组

常用的运算符

  • 成员访问 .
  • 成员简介访问 ->
  • 结构体成员取值 &stu.num
  • 结构体成员自增自减 ++stu.num stu.num--
  • 间接访问运算符 *stu.p

指针访问的基本使用方法

  • 一级直接访问
c
#include <stdio.h>                                                                    
  2 
  3 struct student{
  4     int num;
  5     char sex;
  6     char name[10];
  7     int age;
  8 
  9 };
 10 
 11 int main(void){
 12     struct student stu = {100, 'F', "jim", 20};
 13     printf("stu.num : %d\n", stu.num);//直接访问
 14     printf("stu.sex : %c\n", stu.sex);
 15     printf("stu.name : %s\n", stu.name);
 16     printf("stu.age : %d\n", stu.age);
 17     puts("");
 18 	
 19     struct student *p;
 20     p = &stu;
 21     printf("(*p).num : %d\n", (*p).num);
 22     printf("(*p).sex : %c\n", (*p).sex);
 23     printf("(*p).name : %s\n", (*p).name);
 24     printf("(*p).age : %d\n", (*p).age);
 25     puts("");
 26 	//指针访问
 27     printf("p->num : %d\n", p->num);
 28     printf("p->num : %c\n", p->sex);
 29     printf("p->num : %s\n", p->name);
 30     printf("p->num : %d\n", p->age);
 31     puts("");
 32     return 0;
 33 }     

result:

stu.num : 100
stu.sex : F
stu.name : jim
stu.age : 20

(*p).num : 100
(*p).sex : F
(*p).name : jim
(*p).age : 20

p->num : 100
p->num : F
p->num : jim
p->num : 20

嵌套指针的使用方法

c
  1 #include <stdio.h>                                                                   
  2 
  3 struct score{
  4     unsigned int chinese;
  5     unsigned int english;
  6     unsigned int math;
  7 };//没有使用到
  8 
  9 struct student{
 10     unsigned int stu_num;
 11     unsigned int score;
 12 };
 13 
 14 struct teacher{
 15     unsigned int work_num;
 16     unsigned int salary;
 17 };
 18 
 19 struct people{
 20     char sex;
 21     char name[10];
 22     int age;
 23     struct student *stup;
 24     struct teacher ter;
 25 };
 26 
 27 void struct_print1(void)
 28 {
 29     struct student stu = {1001, 99};
 30     struct teacher ter = {8001, 8000};
 31     struct people jim = {'F', "JimGreen", 20, &stu, 0};
 32     struct people jack = {'F', "Jack", 50, NULL, ter};
 33     struct people *p;
 34     
 35     p = &jim;
 36     printf("jim score: %d\n", jim.stup->score);//访问成员的指针结构体
 37     printf("jim score: %d\n", p->stup->score);
 38     p = &jack;
 39     printf("jack score: %d\n", jack.ter.salary);//访问成员的普通结构体
 40     printf("jack score: %d\n", p->ter.salary);
 41 }
 42 void struct_print2(void){
 43     struct student stu = {1001, 99};                 
 44     struct teacher ter = {8001, 8000};
 45     //struct people a[2] = {'F', "JimGreen", 20, &stu, 0}, \
 		//{'F', "Jack", 50, 0, ter};这里应该由大括号包裹,但是上传时会出错所以去掉了
 46     struct people *p;
 47     p = a;
 48     printf("Jim score: %d\n", a[0].stup->score++);//通过++来确定是不是访问的同一个数据
 49     printf("Jim score: %d\n", ++p[0].stup->score);
 50     printf("Jim score: %d\n", p[0].stup->score++);
 51     
 52 
 53     printf("Jack salary: %d\n", a[1].ter.salary++);
 54     printf("Jack salary: %d\n", p[1].ter.salary++);
 55     printf("Jack salary: %d\n", (p+1)->ter.salary++);
 56 }
 57 
 58 int main(){
 59     struct_print1();
 60     puts("");
 61     struct_print2();
 62     puts("");
 63     return 0;
 64 }


result:


jim score: 99
jim score: 99
jack score: 8000
jack score: 8000

Jim score: 99
Jim score: 101
Jim score: 101
Jack salary: 8000
Jack salary: 8001
Jack salary: 8002

结构体是一个标量,在使用时通过参数传递时候传递整个结构体,最好用指针传递大结构体