天天看點

2015.08.21 結構體指針

   1、 //整形指針指向整型變量的指針

   int *p = null;//指針的辨別,告訴編譯器這是個指針變量

    int a = 10;

    p = &a;   

    printf("%d\n",*p);//取出指針變量p指向記憶體中的值

  *p = 20;//*向指針變量p指向的記憶體中存儲資料

   //浮點型指針:指向浮點型變量指針;

  float *p1 = null;

  float b = 3.14;

   p1 = &b;   printf("%.2f\n",*p1);   

   //字元型指針:指向字元型變量的指針

  char *p2 = null;

    char c = 'a';

   p2 = &c;

    printf("%c\n",*p2); 

  //總結:什麼類型的指針,就是這個指針指向什麼類型的變量

2、結構體指針的格式

指針的定義的格式:類型标示符 *指針變量名 =初始值;

結構體的首位址,就是結構體第一個成員變量的首位址

//    int *p1 = null;

//    int a = 20;

//    p1 = &a;

//   *p1  等價于 a

//        ->   指向操作符

//   ->   前面隻能是結構體指針變量,而且必須是指向結構體變量首位址的結構體指針變量

3、經典例題——————————————————

//定義一個老師的結構變量“liwu hua”

//通過結構體指針将姓名中的首字母改為大寫,并把' ' 改為'_';

//    teacher teacher2 = {"xia yin jun",30,"playplane"};

//    t = &teacher2;//指針的重指向

//    if (t->name[0] >= 'a' && t->name[0] <= 'z') {

//        t->name[0] -= 32;

//    }

//    

//    int i = 0;

//    while (t->name[i] != '\0') {

//        if (t->name[i] == ' ') {

//            t->name[i] = '_';

//        }

//        i++;

//    printf("%s%d %s\n",t->name,t->age,t->hobby);

4、公式:

//結構體數組和指針

    student stu[5] = {

        {1,"guanxi",'m',19,90},

        {3,"tingfeng",'m',20,91},

        {2,"bozhi",'w',18,99},

        {5,"lizongrui",'y',30,59},

        {4,"zhaosi",'y',40,100}

    };

    數組名就是指針,指向數組的首位址,數組首個元素的位址

    *stu                 :   stu[0]

    *(stu + 1)  : stu[1]

    *(stu + 2)  :    stu[2]

    *(stu + 3)  :    stu[3]

    *(stu + 4)  :    stu[4]

    *(stu + 5)  :    stu[5]

    //通路數組中元素的姓名成員變量

    //          (*stu).name   :     stu[0].name

    //(*(stu+1)).name   :     stu[1].name

    //(*(stu+2)).name   :     stu[2].name

    //(*(stu+3)).name   :     stu[3].name

    //(*(stu+4)).name   :     stu[4].name

    //(*(stu+5)).name   :     stu[5].name

    printf("%s\n",(*stu).name);1

    printf("%s\n",stu[0].name);

// ->使用指向操作符通路數組中元素

    //stu ->name           :            stu[0].name

    //(stu + 1) ->name  :            stu[1].name

    //(stu + 2) ->name  :            stu[2].name

    //(stu + 3) ->name  :            stu[3].name

    //(stu + 4) ->name  :            stu[4].name

    printf("%s\n",stu->name);

    printf("%s\n",(stu +1) ->name );

    //将數組中的第四個元素的名字改為“ajiao”

    strcpy((stu +3)->name, "ajiao");

    printf("%s\n",(stu + 3)->name);

5、  差別   

   //str 數組中存儲的字元串是從常量去拷貝過來的,放到自己的空間裡這時修改數組中的資料,沒有影響到常量區内容;

//    char str[] = "iphone";

//    char *p1 = str;

//    p1[1] = 'p';

//    printf("%s\n",p1);

    //*p2指向的是常量區的字元串,常量區的内容是不允許修改的,這時指針p2隻擁有通路權,沒有修改權

//    char *p2 = "iphone";

//    p2[1]= 'p';     error  !!!

//    printf("%s\n",p2);

轉自:http://blog.csdn.net/qq_31810357

繼續閱讀