数组与字符串、字符指针与其他类型指针、赋值参数、指针参数以及引用参数、函数指针

本文深入探讨了 C++ 中数组与字符串的区别、字符指针与其他类型指针的不同用法、参数传递机制(包括按值、按指针和按引用),以及函数指针的应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:http://www.cppblog.com/xingjiegaojue/archive/2009/08/12/93099.aspx

数组与字符串、字符指针与其他类型指针、赋值参数、指针参数以及引用参数、函数指针

◆数组和字符串
从表面上看,一个字符串就是一个字符数组,但在C++语句中,两者并不完全相同。
字符串是一个以串尾符"\0"结尾的字符型数组,但任一个字符型数组不见得必为字符串(因为其中可以不包含"\0"结尾字符)。

char  string1[ 7 ] = " China " ;
char  string2[] = " China " ;
char  string3[ 7 ] = {'C','h','i','n','a'} ;
char  string4[ 7 ] = {'C','h','i','n','a','\0'} ;
string1的长度为7,赋初值后其前6个元素已被赋值(第6个元素为'\0');
string2的长度为6(第6个元素为'\0');
string3的长度为7,最后没有串尾符'\0';
string4的长度为7,赋初值后与string1相同。

◆字符指针与其他类型指针的使用区别
读下列程序:
 1 #include < iostream >
 2 using   namespace  std;
 3 int  main()
 4 {
 5    char str[10]="abcdefghi";
 6    int a[10]={0,1,2,3,4,5,6,7,8,9};
 7    cout<<"'cout<<str'=>"<<str<<endl;
 8    cout<<"'cout<<a'=>"<<a<<endl;
 9    cout<<"--------------------"<<endl;
10    cout<<"'cout<<&str'=>"<<&str<<endl;
11    cout<<"'cout<<&a'=>"<<&a<<endl;
12    cout<<"--------------------"<<endl;
13    cout<<"'cout<<(int*)str'=>"<<(int*)str<<endl;
14    cout<<"'cout<<(double*)a'=>"<<(double*)a<<endl;
15    cout<<"--------------------"<<endl;
16    cout<<"'cout<<str+1'=>"<<str+1<<endl;
17    cout<<"'cout<<a+1'=>"<<a+1<<endl;
18    cout<<"--------------------"<<endl;
19    cout<<"'cout<<&str[1]'=>"<<&str[1]<<endl;
20    cout<<"'cout<<&a[1]'=>"<<&a[1]<<endl;
21    cout<<"--------------------"<<endl;
22    cout<<"'cout<<(int*)(str+1)'=>"<<(int*)(str+1)<<endl;
23    cout<<"'cout<<(double*)(a+1)'=>"<<(double*)(a+1)<<endl;
24    cout<<"--------------------"<<endl;
25    cout<<"'cout<<(double*)(&str[1])'=>"<<(double*)(&str[1])<<endl;
26    cout<<"'cout<<(double*)(&a[1])'=>"<<(double*)(&a[1])<<endl;
27    cout<<"--------------------"<<endl;
28    return 0;
29}

30
输出结果:
 1 ' cout<<str ' => abcdefghi
 2 ' cout<<a ' => 0X0065FDC4       // 存放地址,可以不同(下同)
 3 --------------------------
 4 ' cout<<&str ' => 0X0065FDEC
 5 ' cout<<&a ' => 0X0065FDC4
 6 --------------------------
 7 ' cout<<(int*)str ' => 0X0065FDEC
 8 ' cout<<(double*)a ' => 0X0065FDC4
 9 --------------------------
10 ' cout<<str+1 ' => bcdefghi
11 ' cout<<a+1 ' => 0X0065FDC8
12 --------------------------
13 ' cout<<&str[1] ' => bcdefghi
14 ' cout<<&a[1] ' => 0X0065FDC8
15 --------------------------
16 ' cout<<(int*)(str+1) ' => 0X0065FDED
17 ' cout<<(double*)(a+1) ' => 0X0065FDC8
18 --------------------------
19 ' cout<<(double*)(&str[1]) ' => 0X0065FDED
20 ' cout<<(double*)(&a[1]) ' => 0X0065FDC8
21 --------------------------
分析:
字符指针与其他类型的指针(如int型指针)在使用上是有所区别的(字符指针具有其特殊性)。如,输出字符数组名即字符指针
,就是输出字符指针所指向的那一个字符串;而输出int型数组名即int型指针,就是输出当前的指针值(一个地址)。但输出
字符数组名取地址,或输出int型数组名取地址,都可以输出当前的指针值(一个地址)。另外,若将字符数组名即字符指针
的类型进行转换后,输出的将是当前的指针值(一个地址)。

◆赋值参数、指针参数以及引用参数的使用区别
读下面程序:
 1 #include < iostream >
 2 using   namespace  std;
 3 int  myFunc( int  i1, int *  pi21, int *&  pi22, int &  ri3, char *  str);
 4
 5 int  main()
 6 {
 7    int i=1,a[2]={21,202},*pa=a,b[2]={21,202},*pb=b,r=3456;
 8    char s[]="ABCDEFG";
 9    cout<<"--------In main position 1--------"<<endl;
10    cout<<"i,*pa,*pb,r,s="<<i<<","<<*pa<<","<<*pb<<","
11        <<r<<","<<s<<endl;
12    cout<<"a[0],a[1],b[0],b[1]="<<a[0]<<","<<a[1]<<","
13        <<b[0]<<","<<b[1]<<endl;
14    int tmp=myFunc(i,pa,pb,r,s);
15    cout<<"--------In main position2 2--------"<<endl;
16    cout<<"i,*pa,*pb,r,s="<<i<<","<<*pa<<","<<*pb<<","
17        <<r<<","<<s<<endl;
18    cout<<"a[0],a[1],b[0],b[1]="<<a[0]<<","<<a[1]<<","
19        <<b[0]<<","<<b[1]<<endl;
20    cout<<"tmp="<<tmp<<endl;
21    return 0;
22}

23 int  myFunc( int  i1, int *  pi21, int *&  pi22, int &  ri3, char *  str)
24 {
25    cout<<"--------In myFunc position 1-------"<<endl;
26    cout<<"i1,*pi21,*pi22,ri3,str="<<i1<<","<<*pi21<<","
27        <<*pi22<<","<<ri3<<","<<str<<endl;
28    i1++;
29    pi21++;
30    pi22++;
31    ri3++;
32    (*str)++;
33    cout<<"--------In myFunc position 2-------"<<endl;
34    cout<<"i1,*pi21,*pi22,ri3,str="<<i1<<","<<*pi21<<","
35        <<*pi22<<","<<ri3<<","<<str<<endl;
36    i1++;
37    (*pi21)++;
38    (*pi22)++;
39    ri3++;
40    str++;
41    cout<<"--------In myFunc position 3-------"<<endl;
42    cout<<"i1,*pi21,*pi22,ri3,str="<<i1<<","<<*pi21<<","
43        <<*pi22<<","<<ri3<<","<<str<<endl;
44
45    return i1;
46}

47
运行结果为:
-------- In main position  1 --------
i,
* pa, * pb,r,s = 1 , 21 , 21 , 3456 ,ABCDEFG
a[
0 ],a[ 1 ],b[ 0 ],b[ 1 ] = 21 , 202 , 21 , 202
-------- In myFunc position  1 -------
i1,
* pi21, * pi22,ri3,str = 1 , 21 , 21 , 3456 ,ABCDEFG
-------- In myFunc position  2 -------
i1,
* pi21, * pi22,ri3,str = 2 , 202 , 202 , 3457 ,BBCDEFG
-------- In myFunc position  3 -------
i1,
* pi21, * pi22,ri3,str = 3 , 203 , 203 , 3458 ,BCDEFG
-------- In main position2  2 --------
i,
* pa, * pb,r,s = 1 , 21 , 203 , 3458 ,BBCDEFG
a[
0 ],a[ 1 ],b[ 0 ],b[ 1 ] = 21 , 203 , 21 , 203
tmp
= 3

◆函数指针
读程序:
 1 #include < iostream >
 2 #include < cmath >
 3 using   namespace  std;
 4 double  func1( double  x);
 5 double  func2( double  y);
 6 double  func3( double  z);
 7 void  processing( double  x, double ( * fpt)( double ));
 8
 9 int  main()
10 {
11    double x,res;
12    double (*fp)(double);
13    cout<<"Input a real number:";
14    cin>>x;
15    fp=func1;
16    res=(*fp)(x);
17    cout<<"res=(*fp)(x)="<<res<<endl;
18    fp=func2;
19    res=(*fp)(x);
20    cout<<"res=(*fp)(x)="<<res<<endl;
21    processing(x,func3);
22    fp=func3;
23    processing(x,fp);
24    return 0;
25}

26 double  func1( double  x)
27 {
28    cout<<" ---Call func1: 1/x="<<1/x<<endl;
29    return (1/x);
30}

31 double  func2( double  x)
32 {
33    cout<<" ---Call func2: x*x="<<x*x<<endl;
34    return (x*x);
35}

36 double  func3( double  x)
37 {
38    cout<<" ---Call func3: sqrt(x)="<<sqrt(x)<<endl;
39    return sqrt(x);
40}

41 void  processing( double  x, double  ( * fpt)( double ))
42 {
43    cout<<" ---Call processing"<<endl;
44    double result=(*fpt)(x);
45    cout<<" ---result=(*fpt)(x)="<<result<<endl;
46}

47
结果显示:
Input a real number: 5.5
 
--- Call func1:  1 / x = 0.181818
res
= ( * fp)(x) = 0.181818
  
--- Call func2: x * x = 30.25
res
= ( * fp)(x) = 30.25
 
--- Call processing
  
--- Call func3: sqrt(x) = 2.34512
 
--- result = ( * fpt)(x) = 2.34512
 
--- Call processing
  
--- Call func3: sqrt(x) = 2.34512
 
--- result = ( * fpt)(x) = 2.34512
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值