<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()
{
    //1.复习
    //int* p;//int *p;int * p;没有任何区别
    int* p, *q;//定义两个指针  指针前面要记得单独加*

    char chArr[] = "helloworld";//字符数组 存放字符串  栈区
    char *pArr = "helloworld";//指针  字符串存放在常量区 ,指针指向它存放的首地址  字符串不能(不可以被修改)
    //代码区   全局数据区(常量区)   堆区 栈区
    
    /*
    数组输出  除了字符数组 
    字符数组 \0作为结尾 
    printf("%s",chArr);//用printf输出
    %s  输出这个地址和地址后的所有字符  直到遇到\0为止
    scanf("%s",chArr);//数组名就是数组首地址  数组第一个元素的地址
    */
    //相同点 
    puts(chArr);//都可以用来打印printf strcmp  strlen
    puts(pArr);
    //不同点  pArr不能用于输入 
    //gets(chArr);
    //gets(pArr);//不可以修改内容
    //strcpy  strcat strlen  字符串的函数 
    //strcpy(pArr, chArr);//不可以修改常量区

    //2.指针的加加 ++  指针加1 
    //  指针++的时候同时解引用
    int iArr[10] = { 0 };
    int iBrr[10] = { 0 };
    p = iArr, q = iBrr;
    //*p++; (*p)++; 
    printf("*p=%d,p=%p\n", *p, p);
    //*p++;
    *p++=5;  //先给*p赋值  然后p++  等价*p=5,p++
    printf("*p=%d,p=%p\n", *p, p);
    printf("*q=%d,q=%p\n", *q, q);
    (*q)++;
    printf("*q=%d,q=%p\n", *q,q);
    /*
    *p++    p加了1 
    (*p)++  p指向的内容 加了1

    *(p++)  和*p++没有区别//课后自己试试

    *  后++    取值  p++  都是操作指针 
    *p++  
    (*p)++   对*p进++  指向的变量进行++
    
    今天的作业题目 测试作用
    *++p
    ++*p
    附加题(可以不做)  测试二级指针和数组指针加1之后的地址偏移
    */

    //3.指针和数组   (理论)
    /*
    指针加1 偏移一个数据的长度

    数组同样可以看成一个类型   int arr[10]
    arr  -->大小 存数据  地址

    
    
    */
    int idArr[5][10];//二维数组
    //p = idArr;//类型不一致
    //方案1
    //p = &idArr[0][0]; //赋值数组第一个元素地址
    //for (int i = 0; i < 5 * 10; i++)//用指针给数组赋值
    //{
    //    *p = i; 
    //    p++;
    //    //*p++ = i;
    //}

    //方案2
    //数组指针  指针指向整个数组  
    //int (*pd)[10]=idArr;
    int(*pd)[10];//定义一个数组指针
    //pd= idArr;
    pd = &idArr[0];//赋值 
    for (int i = 0; i < 5; i++)//用数组指针给他赋值
    {
        for (int j = 0; j < 10; j++)
        {
            pd[i][j] = i*j;//使用
        }
    }
    /*
    pd[i][j]  (*(p+i))[j]    *(p[i]+j)  *(*(p+i)+j)等价


    *pd[3] ==>*((pd[3])+0)
    */

    //数组指针和指针数组
    int(*point)[10];//数组指针  指向数组的指针
    int *parr[10];//指针数组  int*  parr[10]  指针数组  10个int*  10个元素都是指针

    //二级指针  指针保存的是一个一级指针的地址  用到二级指针
    int **pp;
    pp= &p;//p是一级指针   pp保存一级指针地址

    pp = parr;//指针数组名
    pp = &parr[0];//parr[0]是一个一级指针 

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

}

 

posted @ 2018-01-16 18:38  让优秀成为一种习惯  阅读(141)  评论(0编辑  收藏  举报