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 }
今天就学到这里了,明天继续,加油!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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的设计模式综述