c++笔记(4):数组、指针数组、字符串数组、动态存储

1.
一维数组的元素是基本类型,结构类型或类类型;
int a[]={1,2,3,4,5,6,7};//自动定义数组长度为7 
int a[5]={1,2,3,4,5,6,7};//错误,初始化数据过多
数组名是隐含意义的常指针(直接地址),其关联类型是数组元素的类型
a + i  ==  & a [ i ];
a [ i ] == * (a + i);
注:*a[i]是错误写法;


2.

指针数组的元素类型是指针,元素存放对象的地址
指向数组的指针数组:
#include<iostream>
using namespace std ;
int main()
{ 
    double aa [2] = { 1.1, 2.2 } ;
    double bb [2] = { 3.3, 4.4 } ;
    double cc [2] = { 5.5, 6.6 } ;
    double ( * pf [3] ) [2] ;//pf是长度为3的数组,数组元素是指针,指针的关联类型是长度为2的浮点数组double [2]
    /*用typedef定义
    typedef double aryType [2] ; 
    aryType aa = { 1.1, 2.2 } ;
    aryType bb = { 3.3, 4.4 } ;
    aryType cc = { 5.5, 6.6 } ;
    aryType * pf [ 3 ] ;*/
    pf [0] = & aa ;//&aa虽然和aa一样都是数组aa的首地址,但是&aa和pf[]是二级指针,aa是一级指针,所以此处不能用aa替换&aa
    pf [1] = & bb ; 
    pf [2] = & cc ;		
    for ( int i = 0 ;  i < 3 ;  i ++ )
    { 
        for ( int j = 0 ;  j < 2 ;  j ++ )
        cout << * ( * pf [ i ] + j  ) << "  " ;
        cout << endl ;
    }
}

3.

指向函数的指针数组:

// func.h
#ifndef FUNC_H
#define FUNC_H
const double PI = 3.1415;
double Square_Girth ( double l )  { return  4 * l ; }
double Square_Area ( double l )   { return  l * l ; }
double Round_Girth ( double r )  { return  2 * PI * r ; }
double Round_Area ( double r )   { return  PI * r * r ; }
typedef double  ft  ( double ) ;
#endif
</pre><pre name="code" class="cpp">//ex4_8.cpp
#include<iostream>
using namespace std ;
#include  " func.h "
int main()
{ 
    int  i ;  double x = 1.23 ;
    ft * pfun [ 4 ]  ;//声明指向函数的指针数组
    pfun [ 0 ] = Square_Girth ;//获取函数入口地址
    pfun [ 1 ] = Square_Area ;//获取函数入口地址
    pfun [ 2 ] = Round_Girth ;//获取函数入口地址
    pfun [ 3 ] = Round_Area ;//获取函数入口地址
    for ( i = 0 ;  i < 4 ;  i ++ )
        cout << ( * pfun [ i ] ) ( x ) << endl ;//(*pfun [i])(x)等价调用方式:(pfun[i])(x)

}
4.
 

二维数组的定义和初始化时可以省略第一维长度,不能省略第二维长度

a[0]==*a                   所以*a[0]==a[0][0]

a[0]+1==*a+1           所以*(*a+1)==a[0][1]

a[1]==*(a+1)             所以*a[1]==a[1][0]

a[1]+1==*(a+1)+1     所以*(*(a+1)+1)==a[1][1]

以指针方式访问二维数组:二维数组名a是逻辑上的一个二级指针,a[i]是一级指针;用二维数组名引用基本类型时,应当是二级引用,但不能直接把二维数组名赋给二级指针变量,因为不管 n 维数组,数组名仅是内存块首地址

<pre name="code" class="cpp">#include<iostream>
using namespace std ;
int main()
{ int a[3] [5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ;
   int  * p ;
   for ( p = a [ 0 ] ;  p < a[ 0 ] + 15 ;  p ++ )//初始条件可以替换为p = *a ,p = &a[0][0]  
      cout << *p << "  " ;
   cout << endl ;
   for ( int  i = 0 ;  i < 3 ;  i ++ )
      { for ( int  j = 0 ;  j < 5 ;  j ++ )
            cout << * ( a [ i ] + j ) << "  " ;
         cout << endl ;
      }
}
5.
 
数组作函数参数:数组名作参数传递地址;数组元素和数组名都可以作为引用参数数组指针++是合法操作,数组名++是非法操作;int sum(const int a[],int n)//const的作用是保证对数组元素只读访问6.随机函数:<1>rand()随机函数。返回0~32767的随机值。该函数没有参数 <2>scrand(number)种子函数,要求一个无符号整型参数置随机数生成器的启动值,为使种子值可变,用系统时间做srand函数的参数: 

time()时间函数,在time.h定义。用0作参数时,返回系统当前时间 

srand ( int( time( 0 ) ) ) ;	//调用种子函数
for ( i = 0 ; i < 10 ; i ++ )  a[i] = rand() % 100 ;     //用随机函数初始化数组
6.
动态存储:new和delete操作符
int * p1 = new int ;
char * p2 = new char ;
double * p3 = new double ;
int * p4 = new int [4] ;
......
delete p1 ;
delete p2 ;
delete p3 ;

delete [] p4 ;

对于像int/char/long/int*/struct 等等用new申请的简单数据类型,delete 和delete [] 是一样的!但是如果是对象数组就必须用delete[]

<pre name="code" class="cpp">//调用函数建立动态数组
#include<iostream>
using namespace std ;
void App( int * & pa ,  int n ) ;
int main()
{ int *ary = NULL, *t , i, n ;
   cout<<"n= ";   cin>>n;
  App( ary, n );
  for( i = 0; i<n; i++ ) 
      {ary[i] = 10 + i ; cout<<ary[i]<<"  "; }
  delete []ary;
}
void App( int * & pa    , int len )/*int * & pa是指针引用参数,不能用int *pa代替,因为形参 int *pa是传地址值参数,调用函数时实参ary的值(NULL)赋给形参变量pa函数App执行new操作把地址写入pa,与ary无关,函数返回后,ary不能获得动态数组的地址*/
{ pa = new int [len] ;
  if( pa == NULL )
   { cout << "allocation faiure\n"; return ; }
  for( int i = 0; i<len; i++ ) pa[i] = 0 ; 
}
7.
 
字符串存储:'\0' 为字符串结束标志;'\0' 是ASCII码为0的不可显示字符,即“空操作符”对字符数组以字符串常量进行初始化时,自动添加 '\0'用字符指针管理串:char *string = "Student" ; 操作:建立匿名空间 ;strcpy ( string , "Student" ) ;字符串的访问: 
#include<iostream>
using namespace std ;
int main()
{ char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ;//static char cb [10] = { 'a' , 'b' , 'c' , 'd' , 'e' } ;静态数组自动对其余元素初始化为'\0' 
   for ( int i = 0 ; i < 5 ; i ++ ) 
        cout << ca [i] ;		//逐个数组元素输出
   cout << endl ;
   cout << ca << endl ;		//整体输出字符数组,但由于数组初始化没有结束符,会显示多余的无意义符号
}
cin接收字符串时,空格或换行会自动结束输入.
</pre><pre name="code" class="cpp">char*sp="string";
cout<<sp<<endl;//输出显示"string"
8.
字符串处理函数:
包含空格的字符串输入输出
gets_s( s,10 ); //输入字符串长度<10,因为结尾是“\0”
puts( s );

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值