c++数组易错点总结

时间:2021-06-02 23:25:12

c++数组

1、只有在定义数组是才能使用初始化,此后就不能使用了,也不能将一个数组赋给另一个数组

int cards[4] = { 3 , 6 , 8 , 10};   //ok
int hands[4] ; //ok
hand[4] = {5 , 6 , 7 ,9}; //error,只能在定义时初始化
hand = cards; //error,不能将一个数组赋给另一个数组 //数组名是常量

2、对于数组的下标,编译器不会检查使用的下标是否有效。

3、sizeof运算符返回类型或数据对象的长度(单位为字节)。注意,如果将sizeof运算符用于数组名,得到的僵尸整个数组中的字节数。但如果将sizeof用于数组元素,则得到的将是元素的长度(单位为字节)。

4、数组初始化:

初始化数组时可省略等号;

int cards[4] { 3 , 6 , 8 , 10};   //ok

可不在大括号内包含任何东西,这将把所有的元素都设置为0;

int cards[4]={};    //所有元素都设置为0
double hands[] {}; //所有元素都设置为0

列表初始化禁止缩窄转换。

long plifs[] = {25, 92, 3.0};           //不允许
char slifs[4] = {'h', 'i', 23, '\0'}; //不允许

5、用引号括起的字符串隐式地包括结尾的空字符,因此不用显式地包括它。

char bird[11] = "Mr. Cheeps";   //隐式地包括结尾的空字符,因此不用显式地包括它
char fish[] = "Bubbles"; //让编译器计算长度

6、在数组中使用字符串:sizeof运算符指出整个数组的长度,但strlen()函数返回的是存储在数组中的字符串长度,而不是数组本身的长度。另外,strlen()只计算可见的字符,而不把空字符计算在内。

7、指针和数组:

  • 对数组应用sizeof运算符得到的是数组的长度,而对指针应用sizeof得到的是指针的长度,即使指针指向的是一个数组。
  • 很多情况下,可以以相同的方式使用指针名和数组名。对于它们,可以使用数组方括号表示法,也可以使用解除引用运算符(*)。在多数表达式中,它们都表示地址。区别之一是,可以修改指针的值,而数组名是常量。
  • 数组名被解释为其第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址
short tell[10];         //声明一个20个字节的数组
cout << tell <<endl; //输出&tell[0],即第一个元素的地址
cout << &tell <<endl; //整个数组的地址

从数字上说,这两个地址相同;但从概念上说,&tell[0] (即tell)是一个2字节内存块的地址,而&tell是一个20字节内存块的地址。因此,表达式tell+1将地址值加2,而表达式&tell+2将地址值加20。

8、在cout和多数C++表达式中,char数组名、char指针以及用引号括起来的字符串常量都被解释为字符串第一个字符的地址。

相关知识:

  • 如果给cout提供一个字符地址,则它将从该字符开始打印,直到遇到空字符为止。
  • 用括号括起的字符串也应当是一个地址。在C++中,用引号括起的字符串像数组名一样,也是第一个元素的地址,这意味着对于数组中的字符串、用引号括起的字符串常量以及指针所描述的字符串,处理的方式是一样的,都将传递它们的地址。
  • 字符串字面值是常量。

9、在C++中当且仅当用于函数头或原型中,int arr和int arr[]的含义才相同。在其他上下文中,int arr 和int arr[]的含义并不同。

int sum_arr(int arr[], int n)
int sun_arr(int *arr, int n)
int sum_arr(int arr[n]) //error,不要试图使用方括号表示法来传递数组长度

传递常规变量时,函数将使用该变量的拷贝;但传递数组时,函数将使用原来的数组。