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

本文详细介绍了C语言中的指针概念,包括指针的基本类型、指针与数组的关系、指针的算术运算等内容,并通过具体示例展示了如何在实际编程中应用这些概念。

复习:

    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;
}

 

转载于:https://www.cnblogs.com/guijin/p/8124134.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值