• C语言学习(6)


    一、C语言中的指针

    1. 指针的基本概念

    指针:

      也是一种变量,是一种特殊的变量(专门用来存放其它变量在内存中地址的)

      int a;

      float b;

      一个变量有多个字节(内存中有多个地址编码),指针存放的是这个变量的首地址(最低的地址,起始位置的地址)

    指针的定义:

      类型 *指针的名字

      比如: int *p; //定义了int类型的指针 *表示p是个指针

      float *q;

      char *p;

    指针的使用:

      第一种: 定义一个指针并初始化

      int a=10;

      int *p=&a; // & -->取地址符号(获取变量a在内存中的首地址)

      第二种: 定义一个指针没有立马初始化

      int a=10;

      int *p; //定义了指针p,p存放谁的地址目前是不清楚的

      p=&a;

    指针的几种基本运算

      第一种: 解引用

      通过指针访问指向的变量里面的内容,或者通过指针修改指向的变量

      使用解引用运算

      *p; //把指针p解引用(取出指针p指向的地址里面的内容)

      第二种:取地址

      int a=100;

      int *p=&a; //对a取地址

      小结: 指针是C语言提供的一种间接访问变量的方法

      第三种: 指针可以比较大小

      指针比较大小---》就是把地址当成是数字来比较

    #include <stdio.h>
    
    int main()
    {
        int a = 888;
        int *p = &a; //指针p指向a的首地址
    
        //打印一下变量a在内存中首地址
        printf("a的首地址是:%p
    ", &a);
        printf("指针p中存放的地址是:%p
    ", p);
    
        //指针的作用一: 通过指针访问它指向的地址中的数据内容
        printf("传统的方法访问a的值:%d
    ", a);
        printf("通过指针访问a的值: %d
    ", *p); //解引用p
    
        //指针的作用二: 通过指针修改变量的值
        *p = 666;
        printf("a被修改成了:%d
    ", a);
    }

    练习:

      1. int a[5]; //键盘输入5个数,用指针实现判断这个五个数是不是完数

      完数: 一个数等于自身公因子和 (去除本身)

      比如: 6 ---》公因子(能被6整除就是它的公因子) 1 2 3

      6= 1+2+3

      7 --》 公因子 1

      int *p= &a[0] // *p等价于a[0]

      //如何求*p公因子--> *p分别除以1 2 3 ....*p只要能整除的就是公因子

      p=&a[1]

    #include <stdio.h>
    
    int main()
    {
        int *p, i, j = 0, k;
        int flag = 0;
        int input[5] = {0};
        int temp = 0;
        int output[5] = {0};
        printf("请输入5个数:
    ");
        for (i = 0; i < 5; i++)
            scanf("%d", &input[i]);
    
        for (i = 0; i < 5; i++)
        {
            p = &input[i]; //取地址
            for (k = 1; k < *p; k++)
            {
                flag = *p % k; //取余判断是否整除
                if (flag == 0) //整除为0
                {
                    temp += k;      //将能够整除的k加起来
                    if (temp == *p) //判断是否为完数
                    {
                        output[j++] = *p; //使用数组保存起来
                    }
                }
            }
            temp = 0; //使用完清空
        }
    
        printf("以上5个数是完数的是:
    ");
        for (i = 0; i < j; i++)
        {
            printf("%d ", output[i]);
        }
        printf("
    ");
        return 0;
    }

    作业:

      1.基础题

      输入字符串,分别统计出其中 英文字母、空格、数字和其它字符的个数。

      求a+aa+aaa+aaaa+aa...a的值

      比如:a是3,总共5项(变量n表示) 3+33+333+3333+33333结果是??

      要求a和n从键盘输入

      思路:3+33+333+3333+33333 ---》 3*(1+11+111+1111+11111)

    #include <stdio.h>
    #include <math.h> //因为引用10的n次方才调用pow(10,n)
    
    int main()
    {
        int i, temp = 0, sum = 0, input_1, input_2;
    
        printf("Please enter 2 numbers!
    ");
        scanf("%d %d", &input_1, &input_2);
    
        for (i = 0; i < input_2; i++) //求和:1+11+111+...+i个1
        {
            temp += (int)pow(10, i); //这里调用了math.h中的pow函数,使用10的n次方
            sum += temp;             //1+11+111+…
    
            //思路为:Num[n]=Num[n-1]*10+1;
        }
        sum *= input_1; //将总和乘于第一个数
        printf("The final result is:%d
    ", sum);
        return 0;
    }
    View Code

      2.写一个程序处理字符串A,处理规则是: 只要字符串B里面有的字符,不论大小写,一律从A字符串中删除 (用数组或者指针实现)

      fdjjfDFDdjfjdf ---》 A字符串

      AFafd ---》 B字符串

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        int i, j, k, len_1 = 0, len_2 = 0;
        char input_1[50], input_2[50];
    
        printf("Please enter 2 strings
    ");
        scanf("%s %s", input_1, input_2);
    
        len_1 = strlen(input_1);
        len_2 = strlen(input_2);
    
        //先筛选调字符串B的重复字符
        for (i = 0; i <= len_2 - 1; i++)
        {
            for (j = i + 1; j <= len_2 - 1; j++)
            {
                if (input_2[i] == input_2[j])
                {
    
                    for (k = j; k <= len_2 - 1; k++) //将这个字符丢掉,将后面的字符向前移动
                    {
                        input_2[k] = input_2[k + 1];
                    }
                    len_2--; //字符长度减少
                    j--;     //重新匹对
                }
            }
        }
    
        //字符串A逐个与经过处理的字符串B进行比较,若发现相同的,则剔除
        for (i = 0; i <= len_2 - 1; i++) //字符串B
        {
            for (j = 0; j <= len_1 - 1; j++) //字符串A
            {                                //判断字符串B中的字符是否等于字符串A中的字符,eg:a=a本身;a=A+32;A=a-32
                if ((input_2[i] == input_1[j] + 32) || (input_2[i] == input_1[j]) || (input_2[i] == input_1[j] - 32))
                {
    
                    for (k = j; k <= len_1 - 1; k++) //将这个字符丢掉,将后面的字符向前移动
                    {
                        input_1[k] = input_1[k + 1];
                    }
                    len_1--; //字符长度减少
                    j--;     //重新匹对
                }
            }
        }
    
        printf("Removing duplicate characters:%s
    ", input_1);
        return 0;
    }
    View Code
  • 相关阅读:
    process crashed and the client did not handle it, not reloading the page because we reached the maximum number of attempts
    mac 查看ip
    axios和vue-axios的关系
    export default 和 export 区别
    Mac 编辑hosts文件
    npm --save-dev --save 的区别
    CommonHelper 公共类
    2.06StuModify.aspx(修改姓名,性别,所在班级)
    linux网桥浅析
    Bridge的数据在内核处理流程
  • 原文地址:https://www.cnblogs.com/xiaojian98/p/12447555.html
Copyright © 2020-2023  润新知