c++基础三 (数组——指针) 数组:是一种数据结构,存放固定大小(类型相同)的数据,组都是由连续的内存位置组成。最低的地址对应第一个素,最高的地址对应最后一个素 一维数组: 数组的声明: 数据类型 数组名 [数组大小]; 数组的初始化: 初始化数据个数不能超过数组长度,不然数组越界可以省略数组长度为某个素赋值,数组是从0开始计算 所以 不能大于 数组长度-1数据不够,系统会自动补零 数组的赋值: 单个赋值:a[索引值]=数值; 多个赋值:用for循环 二维数组: 二维数组的声明: 数据类型 数组名 [行的数量][列的数量]; 二维数组的初始化: int a[5][5]={1,2,3,4,5} 个数不能超过 行数×列数,不然数组越界int a[5][5]={{1,2},{3,4},{5,6}} 可以一行一行给出,更加直观int a[ ][5]={1,2,3,4,5} 可以省略行数但不能省略列数 二维数组的赋值: 单个赋值:a[2][4]=30多个赋值:for循环 数组的遍历: 正常的循环语句 for(;;)c++11新添加的遍历语句 for( :) 格式为: for (auto i : 数组名)//用 i 来接收数组的数据 { 内容 } 字符串: 字符串有两种表达方式: 用字符数组表示string表示 字符数组: 字符串的结束标志为’0′,所以数组要多开一个空间存放’0′ 初始化: char a[10]=”asdfghj”char a[]=”asdfghj” //系统计算大小 为8char a[10]={‘a’,’s’,d’,’f’,g’,h’,’j’}以上3种都是初始化方式,后面都会添加’0′ 赋值: //错误的赋值,不能用数组名赋值 char a[10]; a=”pppppppp”; char a[10]; a={‘a’,’s’,d’,’f’,g’,h’,’j’} //用下表赋值 a[0]=10; a[1]=’a’; 常用的字符串函数: strcpy(s1, s2) 复制字符串 s2 到字符串 s1strcat(s1, s2) 连接字符串 s2 到字符串 s1 的末尾strlen(s1)返回字符串 s1 的长度strcmp(s1, s2)如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0(通过ASII码值比较大小)strchr(s1, ch)返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置strstr(s1, s2)返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置 字符数组取长度符号对比: sizeof(b)/sizeof(b[0]) 这样会计算包括’0’的长度strlen() 只会计算真实数据的长度 所以 长度为 sizeof()-1 字符串的3种拷贝: strcpy(A,B):用B的字符串复制给A的memcpy(A,B,Size)把数组B中的Size个字符复制到Asprintf(A,输入格式) 注意事项:以上的A的容量都要>=B的容量,要能存的下B
在这里需要注意一个输出问题,cout是遇到’0’结束的 ,当使用mempy时需要注意的事项, memcpy中的A容量要大于等于B容量大小SIze的大小最好和sizeof(B)的大小一致,不一致的话会导致乱码
string: string是一个类,固定占用28个字节,string没有’0′ 初始化: string p=”asdsafasfasf”; 下面链接有详细用法 c++ string_旷工锁的博客-CSDN博客 指针: 指针是一个变量,其值为另一个变量的地址,通过地址来访问数据 地址:都是一个十六进制表示的数 指针的格式: 类型 * 指针名 ; int *p; *p代表数据 p代表地址 初始化方式: int a=20; int *p=&a; int *p; p=&a; 空指针: 空指针的作用:防止指针指向随机的、不正确的、没有明确限制的地址,防止指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的(也就是野指针) 处理野指针的方法: 把指针变量赋为空指针: 旧的方式 int *p=NULL;新的方式 int *p=nullper (最好使用这种方式) 指针的算术运算: 指针可以使用++、–、+、- 数组名是常指针 不可修改 指针和数组之间的替换 一维数组和指针: 数组名是数组的首地址数组名是一个常指针 不可修改可以对指针操作来访问素 数组地址表示方法: 用数组名: a==&a[0] a+1==&a[1] a+2==&a[2]……用取地址符:&a[0] &a[1] const修饰的指针: const int *p ,int const *p2 指向常量的指针 (的值不能变,指向可以变) int *const p3 指针常量 (值能变,指向不可以变)(&的本质) 判别方法:看const 位于 * 的位置 const * 左边 常量指针* const 右边 指针常量 const int *p:int const *p2 :(指向常量的指针) int *const p2 :( 指针常量 ) 指针数组和数组指针: 1.指针数组: int *p[10]== int *(p[10]) 因为[ ]的优先级大于 * 所以p和[ ]结合 指向:10个int 型的指针 2.数组指针: int (*p)[10] 相当于 int p[][10] 二维数组就是数组指针 指向:数组为10个int型的素 3.二维数组拆解: a[i][j] =*(a[i]+j) = *(*(a+i)+j) =(*(a+i))[j] 指针数组的使用: 数组指针的使用: a+i == p+i a[i] == p[i] == *(a+i) == *(p+i)a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j) 地址表:
多级指针: int a=10; int *p= &a; int q=&p; 指向同一块区域
字符数组和字符指针: 字符数组:和普通数组用法一样,char a[]=”zxcvbnm”;字符指针: 指向字符串的指针, char* p=”sdasdasda”‘ 两者的区别: 存储位置不同,字符串指针放在常量区字符数组 :可读可修改 字符指针:只能读不能修改 char数组名,char指针以及用引号括起的字符串常量都被解释为字符串第一个字符的地址。 所以可以用指针名l 数组做形参: 用指针 用已定义大小的数组用未定义大小的数组 注意:给函数传递数组,数组会自动地退化为一个指向改数组首地址素的指针。因此要同时传递数组的位置进入函数,比如起始位置或者终止位置。 数组退化成指针: 数组作函数参数时,会把数组退化为指针 数组下标转换时会退化成 指针 任何指针都可以转化为 void *void* 可以转化为任何指针
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/47959.html