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 }
复制代码

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

posted @   ahl5esoft  阅读(177)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示