美文网首页C语言
C_10 指针拓展

C_10 指针拓展

作者: Nian糕 | 来源:发表于2017-02-05 12:27 被阅读38次

    1、指针的基本概念

    指针是内存地址
    指针在定义的时候, * 表示指针标识符
    指针在使用的时候, * 表示取内容

    2、指针和数组

    数组指针:是一个指针,只不过它指向的是一个数组
    指针数组:是一个数组,只不过数组里面存放的是指针

    数组指针在使用的时候,我们把数组名赋值给指针
    通过指针偏移可以得到数组后面的数据

    字符指针:一个指针指向了字符数组的首元素地址

    3、函数指针:也是一个指针,只不过指针指向的是函数的地址

    函数指针也叫做函数类型,一个函数指针可以指向一种类型的函数

    4、结构体指针

    常规写法

    struct Cpoint
    {
      int x;
      int y;
    };
    

    定义一个 Cpoint 类型的变量

    struct Cpoint p1={3,4};
    

    结构体调用里面的成员变量

    printf("p1的x=%d,y=%d\n",p1.x,p1.y);
    

    使用 typedef 的命名方式

    typedef struct C_Point
    {
      int x;
      int y;
    }C_P;
    

    定义结构体变量

    C_P p2={4,5};
    printf("p2的x=%d,y=%d\n",p2.x,p2.y);
    

    使用结构体指针操作

    struct C_Point *p=&p2;
    

    结构体指针操作结构体里面的成员变量 (->)

    printf("p2的x=%d,y=%d\n",p->x,p->y);
    

    全局变量和局部变量

    局部变量:定义在某个函数内的变量,它的作用域就是仅限于这个函数
    全局变量:不属于任何函数,在定义之后的函数中都可以使用

    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    //全局变量
    int a=3;
    //通常情况,我们会把结构体定义成全局变量,方便每个函数都可以访问,而且通常情况全局变量都要写在最上面
    typedef struct s
    {
      int num;
      char name[20];
      int score;
    }Student;
    
    int main(int argc, char* argv[])
    {
      void sum();
      printf("a=%d\n",a);
      sum();
    
      Student stu={1,"zhangsan",90};
      //通过指针p3操作,让zhangsan的首字母大写(ASCII码)
      //大写字母:A=65,小写字母:a=97,数字:‘0’=48
    
      printf("大写%c\n",65);
      printf("小写%c\n",97);
      printf("数字%c\n",48);
    
      Student *p3=&stu;
      p3->name[0]=p3->name[0]-32;
      printf("name=%s\n",p3->name);
    
      //让p3的名字中所有的a都换成A
      int i=0;
      while(p3->name[i]!='\0')
        {
          if(p3->name[i]==97)
            {
              p3->name[i]=p3->name[i]-32;
            }
          i++;
        }
      printf("p3的名字是%s\n",p3->name);
    
      for(int j=0;j<strlen(p3->name);j++)
        {
          if(p3->name[j]==110)
            {
              p3->name[j]=p3->name[j]-32;
            }
        }
      printf("p3的名字是%s\n",p3->name);
    
      return 0;
    }
    
    void sum()
    {
      //printf("p的x=%d",p->x);
      printf("a=%d\n",a);
    }
    
    运行结果

    宏是一种预处理指令,它提供了一种机制,可以用来替换源代码中的字符串,宏是用 "#define" 语句定义的

    #include "stdafx.h"
    #include <stdio.h>
    
    //PI表示宏的名字,3.1415926表示宏的值
    //注意:宏没有等号,没有分号,用空格链接,宏就是简单的替换
    #define PI 3.1415926
    #define M 3+4
    #define N (3+4)
    //宏还可以添加参数
    #define Max(A,B) (A*B)
    //定义一个宏,表示1年有多少秒
    #define S (1*365*24*60*60)
    //定义一个宏求两个数的最大值
    #define MAX(X,Y) (X>Y?X:Y)
    
    int main(int argc, char* argv[])
    {
      int a=3;
      //常量:就是不能改变的量
      const int b=2;
      printf("b=%d\n",b);
    
      //PI=3.1415926
      printf("PI=%f\n",PI);
    
      //尽量不要使用浮点类型作为判断条件
      if(PI==3.1415926)
        {
          printf("相等\n");
        }
      else
        {
          printf("不相等\n");
        }
      printf("M*2=%d\n",M*2);//3+4*2
      printf("N*2=%d\n",N*2);
    
      //带参数的宏
      printf("Max=%d\n",Max(3,4));
      printf("Max*M=%d\n",Max(2,4)*M);
      printf("MAX=%d\n",MAX(5,6));
    
      /*
      //先定义一个宏
      #define Version H5
      //如果Version被定义,就会执行#ifdef的语句
      #ifdef Version
      {printf("当前版本是HTML5\n");}
      //没有定义Version宏就会执行#else语句
      #else 
      {printf("当前版本不是HTML5\n");}
    */
      
      //打印一个"出来, \ 表示后面的东西原样输出
      printf("\"\n");
      // 输出'\'
      printf("\\\n");
      // 输出'\\'
      printf("\\\\\n");
    
      return 0;
    }
    
    运行结果

    strcpy() 函数:复制字符串

    定义函数:char *strcpy(char *dest, const char *src);
    函数说明:strcpy() 会将参数 src 字符串拷贝至参数 dest 所指的地址
    返回值:返回参数 dest 的字符串起始地址
    附加说明:如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出 (buffer Overflow) 的错误情况,在编写程序时请特别留意,或者用 strncpy() 来取代

    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    int main(int argc, char* argv[])
    {
      char a[30] = "string(1)";
      char b[] = "string(2)";
      printf("交换前:%s\n", a);
      printf("交换后:%s\n", strcpy(a, b));
      return 0;
    }
    
    运行结果

    strncat() 函数:在字符串的结尾追加n个字符

    strncat() 用于将 n 个字符追加到字符串的结尾,其原型为:char * strncat(char *dest, const char *src, size_t n);
    【参数说明】dest 为目标字符串,src 为源字符串,n 为要追加的字符的数目。strncat() 将会从字符串 src 的开头拷贝 n 个字符到 dest 字符串尾部,dest 要有足够的空间来容纳要拷贝的字符串。如果 n 大于字符串 src 的长度,那么仅将 src 全部追加到 dest 的尾部。strncat() 会将 dest 字符串最后的 '\0' 覆盖掉,字符追加完成后,再追加 '\0'
    【返回值】返回字符串 dest

    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    int main(int argc, char* argv[])
    {
      char url[100] = "abcdefg";
      char path[30] = "0123456789";
      strncat(url, path, 5);  // 1000远远超过path的长度
      printf("%s\n", url);
      return 0;
    }
    
    运行结果

    strcmp() 函数:比较字符串(区分大小写)

    strcmp() 用来比较字符串(区分大小写),其原型为:int strcmp(const char *s1, const char *s2);
    【参数】s1, s2 为需要比较的两个字符串字符串大小的比较是以 ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp() 首先将 s1 第一个字符值减去 s2 第一个字符值,若差值为 0 则再继续比较下个字符,若差值不为 0 则将差值返回。例如字符串 "Ac" 和 "ba" 比较则会返回字符 "A"(65) 和 'b'(98) 的差值 (-33)
    【返回值】若参数 s1 和 s2 字符串相同则返回 0。s1 若大于 s2 则返回大于 0 的值。s1 若小于 s2 则返回小于 0 的值
    注意:strcmp() 以二进制的方式进行比较,不会考虑多字节或宽字节字符;如果考虑到本地化的需求,请使用 strcoll() 函数

    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    int main(int argc, char* argv[])
    {
      char *a1 = "aBcDeF";
      char *b1 = "AbCdEf";
      char *c = "aacdef";
      char *d = "aBcDeF";
      printf("strcmp(a1, b1) : %d\n", strcmp(a1, b1));
      printf("strcmp(a1, c) : %d\n", strcmp(a1, c));
      printf("strcmp(a1, d) : %d\n", strcmp(a1, d));
      return 0;
    }
    
    运行结果

    strchr() 函数:查找某字符在字符串中首次出现的位置

    strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:char * strchr (const char *str, int c);
    【参数】str 为要查找的字符串,c 为要查找的字符。strchr() 将会找出 str 字符串中第一次出现的字符 c 的地址,然后将该地址返回
    注意:字符串 str 的结束标志 NUL 也会被纳入检索范围,所以 str 的组后一个字符也可以被定位
    【返回值】如果找到指定的字符则返回该字符所在地址,否则返回 NULL 。返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串位置。设字符在字符串中首次出现的位置为 i,那么返回的地址可以理解为 str + i
    提示:如果希望查找某字符在字符串中最后一次出现的位置,可以使用 strrchr() 函数

    #include "stdafx.h"
    #include <stdio.h>
    #include <string.h>
    int main(int argc, char* argv[])
    {
      char *s = "0123456789012345678901234567890";
      char *p;
      p = strchr(s, '5');
      printf("%ld\n", s);
      printf("%ld\n", p);
      return 0;
    }
    
    运行结果
    End of File

    行文过程中出现错误或不妥之处在所难免,希望大家能够给予指正,以免误导更多人,最后,如果你觉得我的文章写的还不错,希望能够点一下喜欢关注,为了我能早日成为简书签约作者献上一发助攻吧,谢谢!^ ^

    相关文章

      网友评论

        本文标题:C_10 指针拓展

        本文链接:https://www.haomeiwen.com/subject/hoalbttx.html