zoukankan      html  css  js  c++  java
  • C指针

    讲解C指针

    Int *p = &a   等价于
    int *p;
    p=&a;
    相当于 (int *) p = &a

    二维数组的指针是难点,如何区分元素的地址和元素的值。
    函数的指针: int (*pf)();  指向函数的指针,存放的是函数的地址
                 int *ap(int x,int y) 指针型函数,返回值是指针指针类型

    字符串数组和字符指针的区别:数组是在内存中开辟了一段空间存放字符串;字符串指针是在文字常量区开辟了一段空间存放字符串,将字符串的首地址付给str
    赋值方式:对字符数组只能对各个元素赋值,对字符指针变量可以直接赋值
    注意:char *p;
    scanf(“%s”,p);   这样会出错,p是指向文字常量区的,不用输入
                                    要把p定义成数组 char p[100];

    Strlen 测量字符串长度,但不包括‘\0’

    命令行参数:main(int?argc?,char?*argv[?])  (参数的个数, 指针数组)

    练习:用指针数组存放星期的英文,输入一个数,判断是星期几,输出指针所指向的字符串。输入一个字符,判断是数字,标点或空格,用字符处理函数做。自己写一个字符串处理函数,实现strcpy功能。
    char *my_strcpy(char *dest, const char *src) //*src中的内容不能被改变
    {
        int i = 0;
        while (src[i] != '\0')
        {
            dest[i] = src[i];
            i++;
        }
        dest[i] = '\0';
    }

    字符(串)处理函数的用法,用到什么查书就行了。
    试着编写已有的字符(串)处理函数,实现相同的功能。

        数组 int a[4]= { 1,2,3,4 }

        指针数组 定义一个指针数组,用于存放若干个字的首地址
      int *p[4] ={ &a[0],&a[1],&a[2],&a[3]};

      数组指针 定义一个指向二维数组的指针变量
      int a[3][4] ={
      {1,3,5,7},
      {9,11,13,15},
      {17,19,21,23}
      };
      int (*p)[4] = a;
      p等价于指向二维数组第0行,可完全代替a的作用
    指针数组与字符串的联系:
    char *name[3] = {"Li jing", "Wan mi", "Xu shang"};
    name[0] = "li jing";
    name[1] = "wang mi";
    name[2] =  "Xu shang";
    不要以为数组中存放的是字符串,它存放的是字符串首地址。这一点一定要注意!

    void类型的指针:
    void指针是一种很特别的指针,并不指定它是指向哪一种类型的数
    据,而是根据需要转换为所需数据类型

    main(int argc ,char *argv[ ])

        int i,len=0;
        for(i=1;i<argc;i+=2)
        len+=strlen(argv[i]);
        printf("%d\n",len);

    经编译链接后生成的可执行文件是ex.exe,若运行时输入以下带参数的命令行
    ex   abcd   efg   h3   k44
    执行后输出结果是 6

    指针部分练习题目
            程序设计题(要求用指针的方法完成)

    1、编写程序,将一个字符串反向存放。

    2、编写程序my_strlen(char *str),测得指定字符串的长度

    3、编写一个字符串拷贝函数,my_strcpy(char *dest,char *src)
        将源操作数src中的字符串拷贝到dest所指向的数组中

    4、编写一个函数实现将"12345"变成十进制12345

    5、编写函数my_strcmp(char *str1, char  *str2),比较、返回两等长字符串的大小
    要求相等返回0,字符串1大于字符串2返回1,字符串2大于字符串1返回-1
    字符串1的第一个字母大于字符串2的第一个字母,则判定字符串1大于字符串2,相等
    则比较第二字母,以此类推,全部相同则判定两字符串相等

    习题答案
    1、
    #include <stdio.h>
    #include <string.h>
    typedef unsigned char uchar ;
    typedef unsigned int uint ;

    char str[] = "sdfgjhkdshjstrtgfrsr";

    void reserve(char *str)
    {
        uint i,j;
        char temp;
        printf("%s\n", str);
        j=strlen(str);
         for(i=0;i<j/2;i++)
        {
            temp = *(str+i);
             *(str+i) = *(str+j-i-1);
             *(str+j-i-1) = temp;
        }
        printf("%s\n", str);
    }

    int main(void)
    {

        reserve(str);
        return 0;
    }

    2、
    #include <stdio.h>
    #include <string.h>
    typedef unsigned char uchar ;
    typedef unsigned int uint ;

    char str[] = "0123456789";

    uint my_strlen(char *str)
    {
        uint lenth = 0;
        while(*str!='\0')
        {
            lenth++;
            str++;
        }
        return lenth;
    }

    int main(void)
    {

        printf("字符串长度:%d\n",my_strlen(str));
        return 0;
    }

    3、
    #include <stdio.h>
    #include <string.h>
    typedef unsigned char uchar ;
    typedef unsigned int uint ;

    char target[11] = "";
    char sorce[11] = "0123456789";


    void my_strcpy(char *dest,char *src)//将源操作数src中的字符串拷贝到dest所指向的数组中
    {
        while(*src!='\0')
        {
            *dest = *src;
            dest++;
            src++;
        }
    }

    int main(void)
    {
        printf("操作前的target:%s\n", target);
        printf("操作前的sorce:%s\n", sorce);
        my_strcpy(target, sorce);
        printf("操作后的target:%s\n", target);
        return 0;
    }

    4、
    #include <stdio.h>
    #include <string.h>
    typedef unsigned char uchar ;
    typedef unsigned int uint ;

    char str[] = "123456789";

    uint my_strlen(char *str)
    {
        uint lenth = 0;
        while(*str!='\0')
        {
            lenth++;
            str++;
        }
        return lenth;
    }

    uint conver(char *str)
    {
        uint lenth;
        uint i;
        uint value = 0;

        lenth = my_strlen(str);
        for(i=0;i<lenth;i++)
        {
            value *= 10;
            value += *(str+i)-'0';
        }
        return value;
    }

    int main(void)
    {
        printf("转换后的值:%d\n",conver(str));
        return 0;
    }

    5、
    #include <stdio.h>
    typedef unsigned char uchar ;
    typedef unsigned int uint ;

    char str1[] = "abcdef";
    char str2[] = "abcdef";

    char my_strcmp(char *str1, char  *str2)
    {
        char temp=0;
        uint lenth,lenthtemp = 0;
        lenth = strlen(str1);
        while(temp==0 && lenthtemp<lenth)
        {
            temp = *str1 - *str2;
            str1++;
            str2++;
            lenthtemp++;
        }
        if(temp<0)
        {
            temp = -1;
        }
        else if(temp>0)
        {
            temp = 1;
        }
        return temp;
    }

    int main(void)
    {
        printf("\n比较结果:%d\n",my_strcmp(str1, str2));
        return 0;
    }

  • 相关阅读:
    NFS与通配符
    yum管理RPM包与linux网络设置
    git常用命令总结——覆盖日常开发全操作
    inner join on会过滤掉两边空值的条件
    入园第一天
    P3750 [六省联考2017]分手是祝愿 题解
    CSP2021 爆零记
    CSP 前模板记录(黄题篇)
    对拍
    2021.10.20CSP模拟模拟赛 赛后总结
  • 原文地址:https://www.cnblogs.com/qinkai/p/2429588.html
Copyright © 2011-2022 走看看