1.关于数组
不能将一个数组赋值给另一个数组
int cards[4]={0,1,2,3};
int hand[4];
hand = cards; //wrong;
hand[4] = {2,3,4,5};// wrong,数组只有在定义时才能初始化,此后不能,但是可以用下标分别给数组中的元素赋值
注:但是结构体struct可以用赋值运算符(=)将结构赋给另一个同类型的结构,
即使结构中包含数组成员
数组名是第一个元素的地址,而对整个数组名应用地址运算符时,得到的是整个数组的地址。
short tell[10];
cout<<tell<<endl; //display &tell[0];
cout<<&tell<<endl;//display address of whole array
数字上这两个地址相同。但概念上,&tell[0] 是一个2字节的内存块地址,而&tell是一个20字节的内存块地址。
2.函数和数组:如何将数组作为参数传递给函数?
牢记:数组名是该数组的起始地址,在函数中相应的形参应该是一个指针!
// 也可以用int sumfun(int * arr,int n)。当且仅当用于函数头或函数原型中,
// int * arr和int arr[]含义相同,都意味着arr是一个指针,
// 但 int arr[]:arr不仅指向int,还指向int的一个数组
int sumfun (int arr[],int n)
{
int total = 0;
for(int i = 0;i<n;i++){
total += arr[i];
}
return total;
}
int main()
{
int wages[4] = {1,2,3,4};
int sum = sumfun(wages,4); // 数组名wages是数组的地址,是一个指针,
// 4告诉函数数组的长度,不能直接传递sumfun( wages[4])
cout<<"sum = "<<sum<<endl;
return 0;
}
总结:数组处理函数的常用编写方式:
- 如果要修改该数组: void f_modify( double arr[],int n);
- 如果不修改数组: void f_no_change(const double arr[],int n);
3.函数和二维数组
牢记:数组名是该数组的起始地址,在函数中相应的形参应该是一个指针!
int data[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int total = sum(data , 3);
data是数组名,该数组有3个元素,每个元素是由4个int值组成的一维数组。因此,data的类型是指向由4个int值组成的一维数组的指针。因此函数原型(prototype)为:
// 方式1
int sum ( int (*ar)[4] , int size);
// 方式2
int sum(int ar[][4], int size);//可读性更强
这两个原型都指出ar是指针而不是数组,指针类型还指出它指向由4个int组成的数组,因此指针类型指定了列数,所以不需要把列数作为参数单独传递,而只需传递行数。
注:int (*ar)[4]中的()必不可少,(优先级()>[ ]>*) ,它声明一个指针,该指针指向由4个int值组成的数组;而 int *ar[4] 将声明一个数组,该数组由4个int指针组成。
那么,在定义的函数中如何使用该二维数组呢?
将ar看成是二维数组的名称:
int sum(int ar[][4],int size){
int total = 0;
for ( int r=0;r<size;r++){
for ( int c = 0;c<4;c++){
total = total +ar[r][c]; //ar[r][c] == *(*(ar+r)+c)
}
}
return total;
}