<C> 指针02 - 2017/11/24

复习:

    1.指针类型 -> int*

      指针类型

      指针指向的变量类型

      指针指向哪个变量

 

     2.基本数据类型:4中

      指针类型      -> 存放的地址  和系统有关系  4个字节

      数组类型

      结构体  枚举  联合

 

    3.指针加法和减法:p++ 和数组搭配使用

 

    4.两个运算符:*取值(解引用)    &取地址

 

    5. *(p+i)   p[i] (p是指针  i是整型)

 

      p[i]的地址     &p[i]   -> p+i

 

代码块:

#include <stdio.h>
#include <string.h>

int win;    // 全局变量
int main()
{
#if 0   //  1.复习
    /**  相同点:
    *   数组输出  除了字符数组
    *   字符数组  \0作为结尾
    *   printf_s("%s",chArr);   // 用printf_s输出
    *   %s   输出这个地址和地址后的所有字符     直到遇到 \0 为止
    *   scanf_s("%s",charr);    // 数组名就是数组首地址   数组第一个元素的地址<不需要取地址>
    *
    ***  不同点:
    *    
    */
    int *p,*q;   // 定义两个指针  < 指针前面要记得单独加* >

    char chArr[] = "HelloWorld";   // 字符数组 ->存放字符串
    char *pArr = "HelloWorld";     // 指针(存放地址)  字符串存放在常量区,指针指向它存放的首地址  (不可以被修改)
    // 代码区   全局数据区(常量区)    堆区     栈区

    puts(chArr+1);   // 都可以用来打印printf_s   strcmp   
    puts(pArr);

    // 不同点   pArr不能用于输入
    // gets_s(chArr);
    // gets(pArr);   不可以修改内容
    // strcpy  strcat  strlen   字符串的函数
    //strcpy(pArr,chArr);   // 不可以修改常量区


#elif 0  // 2.指针的加加  ++  指针加 1
    /**
    *    指针 ++ 的时候同时解引用
    *
    *    *p++; (*p)++;
    */
    int *p,*q;   // 定义两个指针
    int iArr[10] = { 0 };
    int iBrr[10] = { 0 };
    p = iArr, q = iBrr;
    printf_s("*p=%d,p=%p\n", *p, p);
    *p++=5;
    // *P++=5;  先给*p 赋值  然后p++   等价 *p = 5,p++
    printf_s("*p=%d,p=%p\n", *p, p);

    printf_s("*q=%d,q=%p\n", *q, q);
    (*q)++;
    printf_s("*q=%d,q=%p\n", *q, q);
    /**
    *    *p++     相当于  p加了1
    *    (*p)++   相当于  p指向的内容 加了1
    *
    *     *(p++)  和*p++没有区别  // 课后自己试试
    *
    *     *    后++     取值    p++      都是操作指针
    *     *p++
    *     (*p)++    对*p进行++     指向的变量进行++
    *
    *      *++p
    *      ++*p
    */



#elif 0  // 3.指针和数组
    /**
    *    指针加1  -> 偏移一个数据的长度
    *    
    *    数组同样可以看成一个类型   int arr[10];
    *     arr  --> 大小  存数据   地址
    */

    int *p, *q;   // 定义两个指针   
    int idArr[5][10];   // 定义一个二维数组
    //p = &idArr;  // 类型不一致
    p = &idArr[0][0];   // 赋值数组第一个元素地址

    /* 方案一: */
    /*for (int i = 0; i < 5 * 10; i++)  // 用指针给数组赋值
    {
        //*p = i;
        //p++;
        *p++=i;
    }*/

    /* 方案二: */
    /**
    *    数组指针   指针指向整个数组
    */
    int(*sum)[10];   // 定义一个数组指针
    sum = idArr;     // 赋值
    //sum = &idArr[0];
    /* 用循环赋值 */
    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            idArr[i][j] = i*j;
        }
    }

    /**
    *    sum[i][j]  等价  (*(p+i))[j]    *(p[i]+j)   *(*(p+i)+j)
    *  
    *    *sum[3] ==>*((sum[3])+0)
    */

    for (int i = 0; i < 5; i++)  // 循环打印
    {
        for (int j = 0; j < 10; j++)
        {
            printf_s("%d\t", idArr[i][j]);
        }
        printf_s("\n");
    }

#elif 1 // 数组指针和指针数组
    int(*point)[10];  // 数组指针   指向数组的指针
    int *parr[10];    // 指针数组   int* parr[10]  指针数组  10个int*  10个元素都是指针
    int *p, *q;

    /**
    *     二级指针   指针保存的是一个一级指针的地址   用到二级指针
    *    
    */
    int **pp = &p;  // p是一级指针   pp保存一级指针地址
    pp = parr;      // 指针数组名  <指向指针数组>
    pp = &parr[0];  // parr[0]是一个一级指针


#endif

    getchar();
    return 0;
}

 

posted @ 2017-12-27 09:13  让优秀成为一种习惯  阅读(135)  评论(0编辑  收藏  举报