【C++学习】一些笔记(02)指针,数组,字符串


前言

学习的一些笔记,重要的才记。

一、指针和数组

1. 指针本质:地址
2. 两个基本操作

① 取地址 &
② 解引用 *
3. 特殊指针
① 野指针:未初始化的指针,或指向未知区域的指针
② 悬浮指针:悬空指针是即使在释放后仍指向内存位置的指针

3. 指针也可以作为数组名使用

p[i] = *(p+i) = *(i+p) = i[p] 

二、字符串

1.字面值

在编译时,编译器会将两个相邻字符串合并成一个相邻,两个字符串字面值之间仅有空白字符。
以空白字符 ‘\0’ 结尾

2.字符串变量

char name[] = "xxxxxx";

//在c++中,这种赋值是const char*类型
char* name = "xxxxxx";

3.读写字符串

1. 写:
① printf + %s + 字符串变量;
② puts:会在字符串后面自动添加换行符’\n’。
2.读
① scanf + %s 和 gets 均不推荐,因为均不会检查数组是否越界;
② 建议用

while(getchar()!='\n'){}

3. 自行实现的 读字符串函数 readline( )

int read_line(char* str, size_t n) {
	int x= 0;
	while (n > 0) {
		char a = getchar();
		if (a == '\n') break;
		*(str+x) = a;
		n--;
		x++;
	}
	*(str+x) = '\0';
	return x;
}

4. 常量指针

  1. const char * str; 不能够通过指针,修改指针指向的对象(地址不能改变)
  2. char * const str; 指针变量的值,不能够修改

3.字符串的库函数

1. 求字符串长度;

size_t strlen(const char *str);

2. 比较两个字符串:根据字典序比较

int strcmp(const char *lhs,const char* rhs);

大于:返回正数
等于:返回0
小于:返回负数

3. 字符串复制:

char *strcpy(char *dest,const char*src)

将src指向的字符串复制到dest,但不会检查数组是否越界

改良:

char* strncpy(char *dest,const char *src,size_t count);

count: 要复制的字符个数,如果src中的字符不够,则在后面补’\0’

4. 字符串拼接:

char *strcat(char *dest,const char *src);

将src指向的字符串拼接到dest后面,但缺点不会检查数组是否越界

改良:

char* strncpy(char *dest,const char *src,size_t count);

count: 最多可以拼接的字符数
示例:

strncat(dest,"world",sizeof(dest)-strlen(dest)-1);
//-1 预留空间给空字符

4. 惯用法

1. 编写strlen函数:搜索字符尾

str指向空字符:

while(*str){
	str++;
}

str 指向空字符后面:

while(*str++);

2. 复制字符串:包括空字符

while(*s1++ = *s2++) ;

5. 字符串数组

  1. 二维数组表示字符串数组
char planet[][2] = {"aaa","bbb"};

缺点:
① 浪费内存空间
② 不灵活

  1. 字符指针数组

三、枚举

作用:表示一些离散的值,比如男女性别

在这里插入图片描述

四、动态内存分配

1. 概念:

垃圾:无法引用的内存空间
内存泄露:申请的空间没有释放,导致程序中存在垃圾
用free 函数释放分配的内存空间,可以减少内内存泄露。
void* :通用指针,可以指向任意类型的对象,并且可以转换其他类型的指针
返回值:如果申请成功,会返回void*类型的指针,如果申请失败会返回空指针

2. 一些函数

void *malloc(size_t size)    //分配内存
void *calloc(size_t nitems, size_t size)    //分配并清零内存
void *realloc(void *ptr, size_t size)//扩充之前分配的内存块

注意: realloc 中的ptr指针必须是以前通过三种内存分配空间函数返回的指针。
图示realloc

3. free 函数

free根据前面格外的实时信息判断释放多大的内存空间。
free

五、函数指针

指向函数的指针:
一个函数在编译时被分配一个入口地址,这个入口地址就称为函数的指针。

函数名代表函数的入口地址,这一点和数组一样。我们可以用一个指针变量来存放这个入口地址,然后通过该指针变量调用函数。

调用方法:

int (*p)(a,b);

(*p)()的意思就是定义一个指向函数的指针变量p, p不是固定指向哪个函数的,而是专门用来存放函数入口地址的变量。在程序中把哪个函数入口地址赋给它,它就指向哪个函数。但是注意,p不能像指向变量的指针变量一样进行p++p–等无意义的操作。
既然p是一个指针变量,那么就可以作为函数的参数进行传递。其实函数的指针变量最常用的用途之一就是作为函数参数传递到其它函数。

六、排序函数

qsort() 函数

void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 

最后一个就是一个比较函数,定义一个比较规则。


总结

基本语法结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值