0%
这是一片思考的空间 -- arthinking
Spring 重构&代码整洁之道 软件设计 JVM 并发编程 数据结构与算法 分布式 存储 网络 微服务 设计模式
Java技术栈 - 涉及Java技术体系

C++语法笔记 - 数组 指针与字符串

数组

数组的声明:

数据类型 标识符[常量表达式1][常量表达式2]…

数组的使用:

数组名[下标表达式1][下标表达式2]…

数组的初始化:

int a[] = {1,1,1};
int a[][3] = {1.2.3.4.5.6}
int a[2][3] = { {1,2,3},{4,5,6}};

数组作为函数的参数:

使用数组名传递数据时,传递的是地址。

对象数组: 声明一个一维对象数组的方法:

类名 数组名[下标表达式];

访问对象的成员:

数组名[下标].成员名

指针

指针也是先声明后使用,声明指针的语法形式是:

数据类型 *标识符;

与地址相关的运算: 和 &*

*称为指针运算符,表示获取指针所指向的变量的值,这是一二一元操作符 & 称取地址运算符

指针的赋值: 声明指针的同时进行初始化赋值:

存储类型 数据类型 * 指针名 = 初始地址;

在声明之后单独使用赋值语句:

指针名 = 地址;

注意: 可以声明指向常量的指针,此时不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外ide对象。 可以声明指针类的常量,这时指针本市的值不能被改变

char const name = “Jason”

void类型的指针可以存储任何类型的对象地址:

void *pv = &i;
int *pint = (int *)pv

指针数组:

如果一个数组的每个元素都是指针变量,这个数组就是指针数组。指针数组的每个元素都必须是同一类型的指针。

声明一维指针数组的语法形式:

类型名T *数组名[下标表达式];

int line1[] = {1,2,3};
int line2[] = {1,2,3};
int line3[] = {1,2,3};
int *p_line[3];
p_line[0] = line1;
p_line[1] = line2;
p_line[2] = line3;
cout << p_line[0][1]; //该句输出为line1数组的第二个元素2

用指针作为函数的参数:

如果以指针作为形参,在调用时实参将传递给形参,也就是使用实参和形参指针变量指向同一内存地址。

返回指针的函数:

数据类型 *函数名(参数表){函数体}

指向函数的指针:

函数指针是专门用来存放函数代码首地址的变量。

声明一个函数指针的方法:

数据类型 (*函数指针名) (形参表)

赋值:

函数指针名 = 函数名;

void print_message(float data_to_print);
void (*function_pointer)(float);
function_pointer = print_message;
function_pointer(1.0);

对象指针:

对象指针遵循一般变量指针的各种规则,声明对象指针的一般语法为:

类名 *对象指针名;

使用指针访问对象成员:

对象指针名 -> 成员名

class A; //前行引用声明
classs B{A *a}; //如果改为class B{A a};则错误,因为类A的定义尚不完整
class A{B b};

指向类的非静态成员的指针 指向对象成员的指针使用前夜要先声明,再赋值,然后引用。 声明共有数据成员和函数成员的指针:

类型说明符 类名 :: *指针名;
型说明符 (类名 :: *指针名)(参数表);

赋值:

指针名 = &类名 :: 数据成员名
指针名 = &类名 :: 函数成员名

使用:

对象名.*类成员指针名 或 对象指针名 -> *类成员指针名
(对象名.*类成员指针名)(参数表)或(对象指针名->*类成员指针名)(参数表)

指向类的静态成员的指针 对类的静态成员的访问时不依赖与对象的,因此可以用普通的指针来指向和访问静态成员:

在Point类中定义:
public:
static int countP;

创建指针:
int *count = &Point :: countP;

动态内存分配:

new运算符和delete运算符:

在C++程序中建立和删除堆对象使用两个运算赋:new 和 delete

运算符new的功能时动态分配内存,或者称为动态创建堆,返回指针:

int *point; point = new int(1);

运算符delete用来删除由new建立的对象,释放指针所指向的内存空间,格式为: delete 指针名;

Point *p = new Point;
delete p; //其中Point为对象

Point *P = new Point[2];
p[0].Move(1,2);
delete []p;

浅拷贝与深拷贝:

浅拷贝:拷贝的对象的成员指针指向的是同一个内存地址。 深拷贝:为复制的对象重新声明新的成员和函数

字符串:

字符数组存储和处理字符串: 字符数组的声明与赋值:

static char str[8] = {‘p’,’r’,’o’,’g’,’r’,’a’,’m’,’\0’};
static char str[] = “program”;

字符串处理函数:

cstring头文件中:strcat(连接)、strcpy(复制)、strcmp(比较)、strlen(求长度)、strlwr(转换为小写)、strupr(转换为大写)。

string类:

(1)构造函数原型

string();
string(const string &rhs);
string(const char *s);
string(const string &rhs, unsigned int pos, unsigned int n);
string(const char *s, unsigned int n);
string(unsigned int n, char c);

(2)常用成员函数功能简介

string append(const char *s);
string assign(const char *s);
int compare(const string& str) const;
string& insert(unsigned int p0, const char *s);
string substr(unsigned int pos, unsigned int n) const;
unsigned int find(const basic_string& str) const;
unsigned int length() const;
void swap(string& str);

欢迎关注我的其它发布渠道

订阅IT宅
内功修炼
Java技术栈
Java架构杂谈是IT宅精品文章公众号,欢迎订阅:
📄 网络基础知识:两万字长文50+张趣图带你领悟网络编程的内功心法 📄 HTTP发展史:三万长文50+趣图带你领悟web编程的内功心法 📄 HTTP/1.1:可扩展,可靠性,请求应答,无状态,明文传输 📄 HTTP/1.1报文详解:Method,URI,URL,消息头,消息体,状态行 📄 HTTP常用请求头大揭秘 📄 HTTPS:网络安全攻坚战 📄 HTTP/2:网络安全传输的快车道 📄 HTTP/3:让传输效率再一次起飞 📄 高性能网络编程:图解Socket核心内幕以及五大IO模型 📄 高性能网络编程:三分钟短文快速了解信号驱动式IO 📄 高性能网络编程:彻底弄懂IO复用 - IO处理杀手锏,带您深入了解select,poll,epoll 📄 高性能网络编程:异步IO:新时代的IO处理利器 📄 高性能网络编程:网络编程范式 - 高性能服务器就这么回事 📄 高性能网络编程:性能追击 - 万字长文30+图揭秘8大主流服务器程序线程模型
📄 Java内存模型:如果有人给你撕逼Java内存模型,就把这些问题甩给他 📄 一文带你彻底理解同步和锁的本质(干货) 📄 AQS与并发包中锁的通用实现 📄 ReentrantLock介绍与使用 📄 ReentrantReadWriteLock介绍与使用 📄 ReentrantLock的Condition原理解析 📄 如何优雅的中断线程 📄 如何优雅的挂起线程 📄 图解几个好玩的并发辅助工具类 📄 图解BlockingQueue阻塞队列
📄 消息队列那么多,为什么建议深入了解下RabbitMQ? 📄 高并发异步解耦利器:RocketMQ究竟强在哪里? 📄 Kafka必知必会18问:30+图带您看透Kafka
📄 洞悉MySQL底层架构:游走在缓冲与磁盘之间 📄 SQL运行内幕:从执行原理看调优的本质 📄 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法