数组与指针
- 数组 vs vector:数组长度固定 且不知道数组长度;数组不能直接复制或者赋值 vector可以
- 字符数组特殊性:char chr1[3]={‘c‘,‘+‘,‘+‘};char chr2[4]="c++";后者会在最后方式放上null字符,表示字符数组结束,需要比字符数量+1个长度
- 数组下标索引:下标类型是size_t(unsigned整型 足够大) 指针索引:类似vector中迭代器索引
- 应该尽量避免使用数组和指针 容易出错 c++中应该多用vector 迭代器 string等来代替
- 指针:string *str; 与 string* str;二者均可,通常使用前者,string *str1, *str2(二者都是指针); srting* str1,str2(让人误以为二者都是指针 实际上只有str1是的);
- 指针:一定要初始化,在指向对象还没有建立的时候可以初始为0/NULL, NULL是从C语言中继承来的,是预处理变量,编译时处理为0,NULL并不是std空间的 不需要std::NULL
- void *指针:特殊性 可保存任何类型对象的地址,但不能用来操纵它指向的对象
- 指针引用区别:引用必须初始化 且只指向一个对象 赋值操作的意义不同
- 表达式中使用数组名会自动转化为指向数组第一个元素的指针
- 指针相减得到数据类型为 ptrdiff_t(signed整型 足够大)
- const指针 指向const对象的指针 指向const对象的const指针
const int *a;//对象为const 指针可另外指向 但是不能通过指针来修改对象的值 int *const a;//指针为const 指针指向不能修改 指向对象的值可以修改 const int *const a;//指向const对象的const指针 const int i=1; int *p=&i;//error 不能把一个const对象的地址 赋值给一个普通的 指向非const对象的指针 void *p=&i;//error const int*p=&i;//ok const void *p=&i;//ok
//pstring是字符串指针 const修饰pstring 修饰的是一个指针 因此是常量指针 而不应该按照字面扩展来理解 typedef string *pstring; const pstring cstr;//cstr是string *const类型 下述三种表达是相同的意思string *const sctr;pstring const sctr;
- 动态数组:动态数组 在运行时才决定数组长度 堆空间用于存储动态分配的对象 new delete实现 需要delete释放空间才可以 string *str=new string[n]();delete [] str;
- 新旧代码的兼容:string中所有使用字符串字面值的地方都可以使用c风格的字符串代替 反之 不行;使用数组初始化vector;
char *chr=str;//error const char *chr=str.c_str();//返回的是const指针 防止chr指针修改str对象 int arr[]={0,1,2,3,4,5}; vector<int> ivec(arr,arr+6);//用数组初始化vector 放入第一个元素和最后一个元素的指针
- 多维数组:即数组的数组 并没有实际上的多维数组 row行 column列
int ia[3][4]; int (*ip)[4]=ia;//ip指针指向 int[4]一个指向4个元素的数组的指针 最多可以ip+2为止 ip=&ia[2]; int *ip[4];//长度为四的数组 数组元素类型为int* typedef int int_array[4];//typedef 简化多维数组的指针 int_array *ip=ia;
c风格字符串
- C++支持c风格的字符串 但是不应该在c++中用 容易带来大量安全问题
- 字符串字面值的类型是const char类型的数组
- c风格字符串 不是C语言类型 也不是c++类型 是以空字符结束的字符数组 char chr[]={‘c‘,‘+‘,‘+‘,‘\0‘};char chr[]="C++";char *chr="C++";均是c风格字符串。若不加null 则不是。(const) char*来操作c风格字符串 标准库cstring是c++中包含处理出风格字符的标准库(与string.h c中字符串库内容相同)
- 数组需要告知其长度 否则无法自己获取其长度; 字符数组在没有加空字符的情况下也不知道数组长度 但c风格字符串可以通过空字符遍历来获取长度 因此c风格字符串是有对应函数可以调用; 需要注意 输入s为非零有空字符的字符串 且目标字符串需要有足够大的空间;strn开头的函数是比strcpy strcat安全,能够控制复制字符的个数
strlen(s);//返回长度 不包含空字符 strcmp(s1,s2);//相等返回0 s1>s2 返回正数 否则返回负数 strcat(s1,s2);//拼接到s1 并返回s1 strcpy(s1,s2);//拷贝给s1 strncat(s1,s2,n);//将s2的前n个字符拼接到s1 strncpy(s1,s2,n);//将s2的前n个字符拷贝到s1
时间: 2024-08-25 07:58:53