1.
一维数组的元素是基本类型,结构类型或类类型;
a + i == & a [ i ];
a [ i ] == * (a + i);
注:*a[i]是错误写法;
指向数组的指针数组:
动态存储: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 ;
字符串处理函数:
包含空格的字符串输入输出
gets_s( s,10 ); //输入字符串长度<10,因为结尾是“\0”
puts( s );
一维数组的元素是基本类型,结构类型或类类型;
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 );