• c/c++学习笔记(7)


      今天主要学习是关于指针的。

         指针与地址

      可以是用一元运算符&用于取一个对象的地址,格式为:p = &c,而*则是间接寻址或者间接引用。

        *p = *p + 10 or *p += 10

      表示*p的值增加10,但是在是用如:

        (*p)++

      时要注意,如果没有括号,则是对p进行加1运算,而不是对p指向的对象进行加1运算。

         指针与数组

      声明:

      int a[10];

      int *p;

      p = &a[0];

      表示指针pa指向数组a的第0个元素,也就是p的值为数组a[0]的地址。也可以写成如下形式:p = a;

      对于数组元素a[i]的引用可以写成*(a+i),C语言在计算数组元素a[i]时,实际上是先将其转换为*(a+i)的形式,因此在程序中,a[i]与*(a+i)是等价的。

      如果分别在两边都加上地址运算符&,我们则可以得出结论:&a[i]与a+i也是等价的。

         字符指针与函数

      如果p是一个指向数组中某个元素的指针,那么p++将对p进行自增运算并指向下一个元素,那么p+=i将对p进行加i的增量运算,使p指向第i个元素。

      因此我们可以改写strlen函数(用于计算字符串长度的函数):

    int strlen(char *s)
    {
        char *p = s;
    
        while (*p != '\0')
        {
            p++;
        }
        return p - s;
    }

      如下定义是有很大差别的:

      char s[] = "abc";

      char *p = "abc";

      s是一个仅仅足以存放初始化字符串以及空字符的一维数组,数组中的单个字符可以进行修改;但是s始终指向同一个存储地址,指向的是一个字符串常量,试图修改字符串内容,结果是没有定义的,但是可以修改指向其他地址。

      接着是一个字符串复制的例子,代码如下:

    1 void strcpy(char *s, char *t)
    2 {
    3     int i = 0;
    4     
    5     while((s[i] = t[i]) != '\0')
    6     {
    7         i++;
    8     }
    9 }

      以上是一个比较简单的写法,但是其实有经验的程序员不这么写,以下2种方式比较好:  

     1 //版本1
     2 void strcpy(char *s, char *t)
     3 {
     4     while ((*s++ == *t++) != '\0')
     5     {
     6          ;
     7     }
     8 }
     9 
    10 //版本2(掌握、推荐)
    11 void strcpy(char *s, char *t)
    12 {
    13     while ((*s++ == *t++))
    14     {
    15          ;
    16     }
    17 }

      因此我们可以推导出对于strlen函数的修改,代码如下:

    1 int strlen(char* s)
    2 {
    3     int len = 0;
    4     while (*s++)
    5     {
    6         len++;
    7     }
    8     return len;
    9 }

      今天就学到这里了,明天继续,加油!

  • 相关阅读:
    JAVA 继承
    JAVA 封装
    windows下vi/vim编辑器的基本操作
    Emacs 快速指南
    如何批量下载bing的背景图片?
    C#制作ActiveX插件
    MQTT协议
    三年前做的代码生成器,可以做为新手学习之用,当时忘了放上源码,实在抱歉!
    nginx lua 打印 特定 header
    利用Php ssh2扩展实现svn自动提交到测试服务器
  • 原文地址:https://www.cnblogs.com/ahl5esoft/p/2525020.html
Copyright © 2020-2023  润新知