Error[8]: Undefined offset: 71, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

数组:是一种数据结构,存放固定大小(类型相同)的数据,组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素 一维数组: 数组的声明:

数据类型  数组名 [数组大小];

int a[5];
double b[10];
float c[30];
数组的初始化:
  • 初始化数据个数不能超过数组长度,不然数组越界
  • 可以省略数组长度
  • 为某个元素赋值,数组是从0开始计算 所以 不能大于 数组长度-1
  • 数据不够,系统会自动补零
数组的赋值: 

单个赋值:a[索引值]=数值;

多个赋值:用for循环

int a[5]={1,2,3,4,5}//个数不能超过数组长度,不然数组越界
int a[ ]={1,2,3,4,5} //可以省略数组长度

//初始化全部为0
int a[5]={0,0,0,0,0};
int a[5]={0};
int a[5]={0*5};

赋值:
a[2]=30;//单个赋值

//用循环进行多个赋值
int a[10];
	for(int i = 0; i < 10; i++)
	{
		a[i] = i + 10;
		cout << a[i] << endl;
	}

二维数组: 二维数组的声明:

数据类型  数组名 [行的数量][列的数量];  

int a[5][10];
double b[10][20];
float c[30][40];
二维数组的初始化:
  • 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循环
数组的遍历:
  1. 正常的循环语句 for(;;)
  2. c++11新添加的遍历语句 for( :)

格式为:

for (auto i : 数组名)//用  i  来接收数组的数据
    {
        内容
    } 

    int a[10];
	for(int i = 0; i < 10; i++)
	{
		a[i] = i + 10;
	}
//第一种
	for(int i = 0; i < 10; i++)
	{
		cout<
字符串:

字符串有两种表达方式:

  1. 用字符数组表示
  2. string表示

字符数组: 字符串的结束标志为'\0',所以数组要多开一个空间存放'\0' 初始化:
  • char a[10]="asdfghj"
  • char a[]="asdfghj"   //系统计算大小   为8
  • char a[10]={'a','s',d','f',g',h','j'}
  • 以上3种都是初始化方式,后面都会添加'strcpy(s1, s2) '
赋值: 

//错误的赋值,不能用数组名赋值

char a[10]; a="pppppppp";

char a[10];  a={'a','s',d','f',g',h','j'}

//用下表赋值

a[0]=10; a[1]='a';

常用的字符串函数:
  • sizeof(b)/sizeof(b[0])  这样会计算包括'
  • strlen()  只会计算真实数据的长度  所以   长度为 sizeof()-1
  • '的长度
    复制字符串 s2 到字符串 s1strcat(s1, s2) 
    连接字符串 s2 到字符串 s1 的末尾strlen(s1)
    返回字符串 s1 的长度strcmp(s1, s2)
    strchr(s1, ch)如果 s1 和 s2 是相同的,则返回 0;如果 s1s2 则返回值大于 0(通过ASII码值比较大小)
    返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置strstr(s1, s2)
    返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置
     字符数组取长度符号对比:
    • *p代表数据
    •  p代表地址

    string:  string是一个类,固定占用28个字节,string没有'\0' 初始化:

    string  p="asdsafasfasf";

    下面链接有详细用法

    c++ string_旷工锁的博客-CSDN博客

    指针:

     指针是一个变量,其值为另一个变量的地址,通过地址来访问数据

    地址:都是一个十六进制表示的数

    指针的格式:

    类型  * 指针名 ; int *p;

    •  int *p=&a;
    •  int *p; p=&a;
    初始化方式:

    int a=20;

      int a = 20; int *p; p = &a;//把p指向a的地址 cout<
    • 旧的方式  int *p=NULL;
  • 新的方式  int *p=nullper (最好使用这种方式)
  • 空指针:

    空指针的作用:防止指针指向随机的、不正确的、没有明确限制的地址,防止指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的(也就是野指针)

    处理野指针的方法:

    把指针变量赋为空指针:

      数组名是常指针  不可修改
    • 数组名是数组的首地址
    指针的算术运算:
     指针可以使用++、--、+、-      
  • 数组名是一个常指针 不可修改
  • 指针和数组之间的替换 
    一维数组和指针:
    1. 可以对指针 *** 作来访问元素
    2. 用数组名:  a==&a[0]     a+1==&a[1]      a+2==&a[2]......
    3. 用取地址符:&a[0]    &a[1]
    数组地址表示方法:
      int a[10] = {0}; int *p; p = a;p = &a[0];//这两种是等价的指针指向数组首地址 访问数组的方式: 1.直接访问数组 a[5]; 2.使用指针 *p ==a[0] *(p+1)==a[1] 3.修改数组的值 a[5]=10; *(p+5)=10;
    1. const int *p  ,int const *p2   指向常量的指针  (的值不能变,指向可以变)
  • int *const p3    指针常量  (值能变,指向不可以变)(&的本质)
  • const修饰的指针:
    • const *  左边  常量指针
    • * const  右边  指针常量

    判别方法:看const 位于 * 的位置

      int a[10] = { 0 }; int b[10] = { 1 * 10 }; const int *p = a; cout << *p << endl; *p = 20; // *p值不能改变(报错) a[0] = 2; //数组可以修改 p = b; // 指向可以改变 int const* p = a; *p = 20;//常量指针 值不能改变(报错) p = b; //常量指针 指向可以改变 a[0] = 2; //数组可以修改 int a[10] = { 0 }; int b[10] = { 1 * 10 }; int * const p = a; cout << *p << endl; *p = 20;//指针常量 值可以改变 a[0] = 30;//数组的值可以修改 p = b; //指针常量 指向不可以改变(报错)
    const int *p:int const *p2 :(指向常量的指针)
    	int a[10] = { 1,2,3,4,5,6,7,8,9 };
    	int* p[10];//指针数组  含有 10个 int型指针
    	p[0] = &a[0]; //p[0]指向a[0]的地址
    	p[1] = &a[1]; //p[1]指向a[1]的地址
    	cout << *(p[0]) << endl;//输出a[0]的值
    	cout << *(p[0] + 1) << endl;//输出a[2]的值
    	cout << *(p[1]) << endl;//输出a[2]的值
    
    存储一个字符串列表
        const char *p[4] = { "aaaa","bbbb","cccc","dddd" };
    	for (int i = 0; i < 4; i++)
    	{
    		cout << p[i] << endl;//输出字符串
            cout<<*(p[i])<< endl;//输出单个字符
    	}
    
    int *const p2 :( 指针常量 )
  • a+i == p+i       
  • 指针数组和数组指针: 

    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)
  •  数组指针的使用:
    1. a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j)
    2. int main() { int a[5][5] = {0,1,2,3,4,5,6,7,8,9}; int(*pa)[5];//数组指针 pa = a; cout << pa << endl; //代表a[0][0]的地址 cout << *pa << endl; //代表a[0][0]的地址 cout << pa[0]+1 << endl; //代表a[0][1]的地址 cout << pa +1<< endl; //代表a[1][0]的地址 cout << **pa << endl; //代表a[0][0]的值 cout << a[0][0] << endl; //代表a[0][0]的值 cout << *(pa[0]) << endl;//代表a[0][0]的值 cout << *(pa[0] +1) << endl;//代表 a[0][1]的值 cout << pa[0][1] << endl; //代表 a[0][1]的值 cout << a[0][1] << endl; //代表 a[0][1]的值 system("pause"); return 0; }
    3. 字符数组:和普通数组用法一样,char a[]="zxcvbnm";

    地址表:

  • 字符指针:  指向字符串的指针,      char* p="sdasdasda"'
  • 多级指针:

    int a=10;    int *p= &a;   int **q=&p;

    指向同一块区域

    字符数组和字符指针:
      常量区只能读不能修改

    两者的区别:

    1. 存储位置不同,字符串指针放在//对这两个进行赋值 char a[5], *p=a; 1.因为a是数组名,所以不能用a来赋值,可以用a的下标赋值 a[1] = 10; for (int i = 0; i < 10; i++) { a[i] = i; } 2.可以用p来赋值 *p = 'p';//单个赋值 p = "pppppp";//因为字符串返回的是首地址,所以用p来接收
    2. 字符数组 :可读可修改       字符指针:
    3. 用指针 

    char数组名,char指针以及用引号括起的字符串常量都被解释为字符串第一个字符的地址。

    所以可以用指针名l

  • 用已定义大小的数组
  • 数组做形参:
    1. 用未定义大小的数组
    2. void text(int *a) { cout << a << endl; } void text(int a[]) { cout << a << endl; } void text(int a[10]) { cout << a << endl; } int a[10] = {1,2,3,4,5,6,7,8,9}; text(a);
    3.  数组作函数参数时,会把数组退化为指针

    注意:给函数传递数组,数组会自动地退化为一个指向改数组首地址元素的指针。因此要同时传递数组的位置进入函数,比如起始位置或者终止位置。

  •  数组下表转换时会退化成 指针
  • 数组退化成指针:
      //做函数形参时 void tect(char a[], char p[5]) { cout << sizeof(a) << endl; cout << sizeof(p) << endl; } char a[5]; char p[5]; tect(a, p);// 结果为 4 4 把数组转化为指针 //数组下表转换 p[1] = *(p + 1);//当元素为p[1]时 编译器会转化为*(p + 1)
    1. 任何指针都可以转化为 void *
  • void* 可以转化为任何指针
    • [+++][+++]

    )
    File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
    File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
    File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
    Error[8]: Undefined offset: 72, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
    File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

    数组:是一种数据结构,存放固定大小(类型相同)的数据,组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素 一维数组: 数组的声明:

    数据类型  数组名 [数组大小];

    int a[5];
    double b[10];
    float c[30];
    数组的初始化:
    • 初始化数据个数不能超过数组长度,不然数组越界
    • 可以省略数组长度
    • 为某个元素赋值,数组是从0开始计算 所以 不能大于 数组长度-1
    • 数据不够,系统会自动补零
    数组的赋值: 

    单个赋值:a[索引值]=数值;

    多个赋值:用for循环

    int a[5]={1,2,3,4,5}//个数不能超过数组长度,不然数组越界
    int a[ ]={1,2,3,4,5} //可以省略数组长度
    
    //初始化全部为0
    int a[5]={0,0,0,0,0};
    int a[5]={0};
    int a[5]={0*5};
    
    赋值:
    a[2]=30;//单个赋值
    
    //用循环进行多个赋值
    int a[10];
    	for(int i = 0; i < 10; i++)
    	{
    		a[i] = i + 10;
    		cout << a[i] << endl;
    	}

    二维数组: 二维数组的声明:

    数据类型  数组名 [行的数量][列的数量];  

    int a[5][10];
    double b[10][20];
    float c[30][40];
    二维数组的初始化:
    • 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循环
    数组的遍历:
    1. 正常的循环语句 for(;;)
    2. c++11新添加的遍历语句 for( :)

    格式为:

    for (auto i : 数组名)//用  i  来接收数组的数据
        {
            内容
        } 

        int a[10];
    	for(int i = 0; i < 10; i++)
    	{
    		a[i] = i + 10;
    	}
    //第一种
    	for(int i = 0; i < 10; i++)
    	{
    		cout<
    字符串:

    字符串有两种表达方式:

    1. 用字符数组表示
    2. string表示

    字符数组: 字符串的结束标志为'\0',所以数组要多开一个空间存放'\0' 初始化:
    • char a[10]="asdfghj"
    • char a[]="asdfghj"   //系统计算大小   为8
    • char a[10]={'a','s',d','f',g',h','j'}
    • 以上3种都是初始化方式,后面都会添加'strcpy(s1, s2) '
    赋值: 

    //错误的赋值,不能用数组名赋值

    char a[10]; a="pppppppp";

    char a[10];  a={'a','s',d','f',g',h','j'}

    //用下表赋值

    a[0]=10; a[1]='a';

    常用的字符串函数:
  • sizeof(b)/sizeof(b[0])  这样会计算包括'
  • strlen()  只会计算真实数据的长度  所以   长度为 sizeof()-1
  • '的长度
    复制字符串 s2 到字符串 s1strcat(s1, s2) 
    连接字符串 s2 到字符串 s1 的末尾strlen(s1)
    返回字符串 s1 的长度strcmp(s1, s2)
    strchr(s1, ch)如果 s1 和 s2 是相同的,则返回 0;如果 s1s2 则返回值大于 0(通过ASII码值比较大小)
    返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置strstr(s1, s2)
    返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置
     字符数组取长度符号对比:
    • *p代表数据
    •  p代表地址

    string:  string是一个类,固定占用28个字节,string没有'\0' 初始化:

    string  p="asdsafasfasf";

    下面链接有详细用法

    c++ string_旷工锁的博客-CSDN博客

    指针:

     指针是一个变量,其值为另一个变量的地址,通过地址来访问数据

    地址:都是一个十六进制表示的数

    指针的格式:

    类型  * 指针名 ; int *p;

    •  int *p=&a;
    •  int *p; p=&a;
    初始化方式:

    int a=20;

      int a = 20; int *p; p = &a;//把p指向a的地址 cout<
    • 旧的方式  int *p=NULL;
  • 新的方式  int *p=nullper (最好使用这种方式)
  • 空指针:

    空指针的作用:防止指针指向随机的、不正确的、没有明确限制的地址,防止指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的(也就是野指针)

    处理野指针的方法:

    把指针变量赋为空指针:

      数组名是常指针  不可修改
    • 数组名是数组的首地址
    指针的算术运算:
     指针可以使用++、--、+、-      
  • 数组名是一个常指针 不可修改
  • 指针和数组之间的替换 
    一维数组和指针:
    1. 可以对指针 *** 作来访问元素
    2. 用数组名:  a==&a[0]     a+1==&a[1]      a+2==&a[2]......
    3. 用取地址符:&a[0]    &a[1]
    数组地址表示方法:
      int a[10] = {0}; int *p; p = a;p = &a[0];//这两种是等价的指针指向数组首地址 访问数组的方式: 1.直接访问数组 a[5]; 2.使用指针 *p ==a[0] *(p+1)==a[1] 3.修改数组的值 a[5]=10; *(p+5)=10;
    1. const int *p  ,int const *p2   指向常量的指针  (的值不能变,指向可以变)
  • int *const p3    指针常量  (值能变,指向不可以变)(&的本质)
  • const修饰的指针:
    • const *  左边  常量指针
    • * const  右边  指针常量

    判别方法:看const 位于 * 的位置

      int a[10] = { 0 }; int b[10] = { 1 * 10 }; const int *p = a; cout << *p << endl; *p = 20; // *p值不能改变(报错) a[0] = 2; //数组可以修改 p = b; // 指向可以改变 int const* p = a; *p = 20;//常量指针 值不能改变(报错) p = b; //常量指针 指向可以改变 a[0] = 2; //数组可以修改 int a[10] = { 0 }; int b[10] = { 1 * 10 }; int * const p = a; cout << *p << endl; *p = 20;//指针常量 值可以改变 a[0] = 30;//数组的值可以修改 p = b; //指针常量 指向不可以改变(报错)
    const int *p:int const *p2 :(指向常量的指针)
    	int a[10] = { 1,2,3,4,5,6,7,8,9 };
    	int* p[10];//指针数组  含有 10个 int型指针
    	p[0] = &a[0]; //p[0]指向a[0]的地址
    	p[1] = &a[1]; //p[1]指向a[1]的地址
    	cout << *(p[0]) << endl;//输出a[0]的值
    	cout << *(p[0] + 1) << endl;//输出a[2]的值
    	cout << *(p[1]) << endl;//输出a[2]的值
    
    存储一个字符串列表
        const char *p[4] = { "aaaa","bbbb","cccc","dddd" };
    	for (int i = 0; i < 4; i++)
    	{
    		cout << p[i] << endl;//输出字符串
            cout<<*(p[i])<< endl;//输出单个字符
    	}
    
    int *const p2 :( 指针常量 )
  • a+i == p+i       
  • 指针数组和数组指针: 

    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)
  •  数组指针的使用:
    1. a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j)
    2. int main() { int a[5][5] = {0,1,2,3,4,5,6,7,8,9}; int(*pa)[5];//数组指针 pa = a; cout << pa << endl; //代表a[0][0]的地址 cout << *pa << endl; //代表a[0][0]的地址 cout << pa[0]+1 << endl; //代表a[0][1]的地址 cout << pa +1<< endl; //代表a[1][0]的地址 cout << **pa << endl; //代表a[0][0]的值 cout << a[0][0] << endl; //代表a[0][0]的值 cout << *(pa[0]) << endl;//代表a[0][0]的值 cout << *(pa[0] +1) << endl;//代表 a[0][1]的值 cout << pa[0][1] << endl; //代表 a[0][1]的值 cout << a[0][1] << endl; //代表 a[0][1]的值 system("pause"); return 0; }
    3. 字符数组:和普通数组用法一样,char a[]="zxcvbnm";

    地址表:

  • 字符指针:  指向字符串的指针,      char* p="sdasdasda"'
  • 多级指针:

    int a=10;    int *p= &a;   int **q=&p;

    指向同一块区域

    字符数组和字符指针:
      常量区只能读不能修改

    两者的区别:

    1. 存储位置不同,字符串指针放在//对这两个进行赋值 char a[5], *p=a; 1.因为a是数组名,所以不能用a来赋值,可以用a的下标赋值 a[1] = 10; for (int i = 0; i < 10; i++) { a[i] = i; } 2.可以用p来赋值 *p = 'p';//单个赋值 p = "pppppp";//因为字符串返回的是首地址,所以用p来接收
    2. 字符数组 :可读可修改       字符指针:
    3. 用指针 

    char数组名,char指针以及用引号括起的字符串常量都被解释为字符串第一个字符的地址。

    所以可以用指针名l

  • 用已定义大小的数组
  • 数组做形参:
    1. 用未定义大小的数组
    2. void text(int *a) { cout << a << endl; } void text(int a[]) { cout << a << endl; } void text(int a[10]) { cout << a << endl; } int a[10] = {1,2,3,4,5,6,7,8,9}; text(a);
    3.  数组作函数参数时,会把数组退化为指针

    注意:给函数传递数组,数组会自动地退化为一个指向改数组首地址元素的指针。因此要同时传递数组的位置进入函数,比如起始位置或者终止位置。

  •  数组下表转换时会退化成 指针
  • 数组退化成指针:
      //做函数形参时 void tect(char a[], char p[5]) { cout << sizeof(a) << endl; cout << sizeof(p) << endl; } char a[5]; char p[5]; tect(a, p);// 结果为 4 4 把数组转化为指针 //数组下表转换 p[1] = *(p + 1);//当元素为p[1]时 编译器会转化为*(p + 1)
    1. 任何指针都可以转化为 void *
  • void* 可以转化为任何指针
    • [+++]

    )
    File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
    File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
    File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
    c++基础三 (数组——指针)_C_内存溢出

    c++基础三 (数组——指针)

    c++基础三 (数组——指针),第1张

    数组:是一种数据结构,存放固定大小(类型相同)的数据,组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素 一维数组: 数组的声明:

    数据类型  数组名 [数组大小];

    int a[5];
    double b[10];
    float c[30];
    数组的初始化:
    • 初始化数据个数不能超过数组长度,不然数组越界
    • 可以省略数组长度
    • 为某个元素赋值,数组是从0开始计算 所以 不能大于 数组长度-1
    • 数据不够,系统会自动补零
    数组的赋值: 

    单个赋值:a[索引值]=数值;

    多个赋值:用for循环

    int a[5]={1,2,3,4,5}//个数不能超过数组长度,不然数组越界
    int a[ ]={1,2,3,4,5} //可以省略数组长度
    
    //初始化全部为0
    int a[5]={0,0,0,0,0};
    int a[5]={0};
    int a[5]={0*5};
    
    赋值:
    a[2]=30;//单个赋值
    
    //用循环进行多个赋值
    int a[10];
    	for(int i = 0; i < 10; i++)
    	{
    		a[i] = i + 10;
    		cout << a[i] << endl;
    	}

    二维数组: 二维数组的声明:

    数据类型  数组名 [行的数量][列的数量];  

    int a[5][10];
    double b[10][20];
    float c[30][40];
    二维数组的初始化:
    • 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循环
    数组的遍历:
    1. 正常的循环语句 for(;;)
    2. c++11新添加的遍历语句 for( :)

    格式为:

    for (auto i : 数组名)//用  i  来接收数组的数据
        {
            内容
        } 

        int a[10];
    	for(int i = 0; i < 10; i++)
    	{
    		a[i] = i + 10;
    	}
    //第一种
    	for(int i = 0; i < 10; i++)
    	{
    		cout<
    字符串:

    字符串有两种表达方式:

    1. 用字符数组表示
    2. string表示

    字符数组: 字符串的结束标志为'\0',所以数组要多开一个空间存放'\0' 初始化:
    • char a[10]="asdfghj"
    • char a[]="asdfghj"   //系统计算大小   为8
    • char a[10]={'a','s',d','f',g',h','j'}
    • 以上3种都是初始化方式,后面都会添加'strcpy(s1, s2) '
    赋值: 

    //错误的赋值,不能用数组名赋值

    char a[10]; a="pppppppp";

    char a[10];  a={'a','s',d','f',g',h','j'}

    //用下表赋值

    a[0]=10; a[1]='a';

    常用的字符串函数:
  • sizeof(b)/sizeof(b[0])  这样会计算包括'
  • strlen()  只会计算真实数据的长度  所以   长度为 sizeof()-1
  • '的长度
    复制字符串 s2 到字符串 s1strcat(s1, s2) 
    连接字符串 s2 到字符串 s1 的末尾strlen(s1)
    返回字符串 s1 的长度strcmp(s1, s2)
    strchr(s1, ch)如果 s1 和 s2 是相同的,则返回 0;如果 s1s2 则返回值大于 0(通过ASII码值比较大小)
    返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置strstr(s1, s2)
    返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置
     字符数组取长度符号对比:
    • *p代表数据
    •  p代表地址

    string:  string是一个类,固定占用28个字节,string没有'\0' 初始化:

    string  p="asdsafasfasf";

    下面链接有详细用法

    c++ string_旷工锁的博客-CSDN博客

    指针:

     指针是一个变量,其值为另一个变量的地址,通过地址来访问数据

    地址:都是一个十六进制表示的数

    指针的格式:

    类型  * 指针名 ; int *p;

    •  int *p=&a;
    •  int *p; p=&a;
    初始化方式:

    int a=20;

      int a = 20; int *p; p = &a;//把p指向a的地址 cout<
    • 旧的方式  int *p=NULL;
  • 新的方式  int *p=nullper (最好使用这种方式)
  • 空指针:

    空指针的作用:防止指针指向随机的、不正确的、没有明确限制的地址,防止指针指向了一个地址是不确定的变量,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的(也就是野指针)

    处理野指针的方法:

    把指针变量赋为空指针:

      数组名是常指针  不可修改
    • 数组名是数组的首地址
    指针的算术运算:
     指针可以使用++、--、+、-      
  • 数组名是一个常指针 不可修改
  • 指针和数组之间的替换 
    一维数组和指针:
    1. 可以对指针 *** 作来访问元素
    2. 用数组名:  a==&a[0]     a+1==&a[1]      a+2==&a[2]......
    3. 用取地址符:&a[0]    &a[1]
    数组地址表示方法:
      int a[10] = {0}; int *p; p = a;p = &a[0];//这两种是等价的指针指向数组首地址 访问数组的方式: 1.直接访问数组 a[5]; 2.使用指针 *p ==a[0] *(p+1)==a[1] 3.修改数组的值 a[5]=10; *(p+5)=10;
    1. const int *p  ,int const *p2   指向常量的指针  (的值不能变,指向可以变)
  • int *const p3    指针常量  (值能变,指向不可以变)(&的本质)
  • const修饰的指针:
    • const *  左边  常量指针
    • * const  右边  指针常量

    判别方法:看const 位于 * 的位置

      int a[10] = { 0 }; int b[10] = { 1 * 10 }; const int *p = a; cout << *p << endl; *p = 20; // *p值不能改变(报错) a[0] = 2; //数组可以修改 p = b; // 指向可以改变 int const* p = a; *p = 20;//常量指针 值不能改变(报错) p = b; //常量指针 指向可以改变 a[0] = 2; //数组可以修改 int a[10] = { 0 }; int b[10] = { 1 * 10 }; int * const p = a; cout << *p << endl; *p = 20;//指针常量 值可以改变 a[0] = 30;//数组的值可以修改 p = b; //指针常量 指向不可以改变(报错)
    const int *p:int const *p2 :(指向常量的指针)
    	int a[10] = { 1,2,3,4,5,6,7,8,9 };
    	int* p[10];//指针数组  含有 10个 int型指针
    	p[0] = &a[0]; //p[0]指向a[0]的地址
    	p[1] = &a[1]; //p[1]指向a[1]的地址
    	cout << *(p[0]) << endl;//输出a[0]的值
    	cout << *(p[0] + 1) << endl;//输出a[2]的值
    	cout << *(p[1]) << endl;//输出a[2]的值
    
    存储一个字符串列表
        const char *p[4] = { "aaaa","bbbb","cccc","dddd" };
    	for (int i = 0; i < 4; i++)
    	{
    		cout << p[i] << endl;//输出字符串
            cout<<*(p[i])<< endl;//输出单个字符
    	}
    
    int *const p2 :( 指针常量 )
  • a+i == p+i       
  • 指针数组和数组指针: 

    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)
  •  数组指针的使用:
    1. a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j)
    2. int main() { int a[5][5] = {0,1,2,3,4,5,6,7,8,9}; int(*pa)[5];//数组指针 pa = a; cout << pa << endl; //代表a[0][0]的地址 cout << *pa << endl; //代表a[0][0]的地址 cout << pa[0]+1 << endl; //代表a[0][1]的地址 cout << pa +1<< endl; //代表a[1][0]的地址 cout << **pa << endl; //代表a[0][0]的值 cout << a[0][0] << endl; //代表a[0][0]的值 cout << *(pa[0]) << endl;//代表a[0][0]的值 cout << *(pa[0] +1) << endl;//代表 a[0][1]的值 cout << pa[0][1] << endl; //代表 a[0][1]的值 cout << a[0][1] << endl; //代表 a[0][1]的值 system("pause"); return 0; }
    3. 字符数组:和普通数组用法一样,char a[]="zxcvbnm";

    地址表:

  • 字符指针:  指向字符串的指针,      char* p="sdasdasda"'
  • 多级指针:

    int a=10;    int *p= &a;   int **q=&p;

    指向同一块区域

    字符数组和字符指针:
      常量区只能读不能修改

    两者的区别:

    1. 存储位置不同,字符串指针放在//对这两个进行赋值 char a[5], *p=a; 1.因为a是数组名,所以不能用a来赋值,可以用a的下标赋值 a[1] = 10; for (int i = 0; i < 10; i++) { a[i] = i; } 2.可以用p来赋值 *p = 'p';//单个赋值 p = "pppppp";//因为字符串返回的是首地址,所以用p来接收
    2. 字符数组 :可读可修改       字符指针:
    3. 用指针 

    char数组名,char指针以及用引号括起的字符串常量都被解释为字符串第一个字符的地址。

    所以可以用指针名l

  • 用已定义大小的数组
  • 数组做形参:
    1. 用未定义大小的数组
    2. void text(int *a) { cout << a << endl; } void text(int a[]) { cout << a << endl; } void text(int a[10]) { cout << a << endl; } int a[10] = {1,2,3,4,5,6,7,8,9}; text(a);
    3.  数组作函数参数时,会把数组退化为指针

    注意:给函数传递数组,数组会自动地退化为一个指向改数组首地址元素的指针。因此要同时传递数组的位置进入函数,比如起始位置或者终止位置。

  •  数组下表转换时会退化成 指针
  • 数组退化成指针:
      //做函数形参时 void tect(char a[], char p[5]) { cout << sizeof(a) << endl; cout << sizeof(p) << endl; } char a[5]; char p[5]; tect(a, p);// 结果为 4 4 把数组转化为指针 //数组下表转换 p[1] = *(p + 1);//当元素为p[1]时 编译器会转化为*(p + 1)
    1. 任何指针都可以转化为 void *
  • void* 可以转化为任何指针
    • 欢迎分享,转载请注明来源:内存溢出

      原文地址: http://outofmemory.cn/langs/1329918.html

      (0)
      打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
      上一篇 2022-06-12
      下一篇 2022-06-12

      发表评论

      登录后才能评论

      评论列表(0条)