前面对于处理数组的方法是:传递多个参数,第一个是指向数组起始处的指针,第二个是数组长度。
这种是指定元素区间,传递两个指针,一个指向数组的开头,一个指向数组的尾部。
可以了解下c++标准模板库STL所提到的超尾的概念。
double eat[20];
数组名eat指向数组的第一个元素,就是所说的头部;
eat+19指向数组的最后一个元素,eat+20指向数组的尾部了;
第一,指针指向一个常量对象,这样可以防止使用该指针修改所指向的值;
第二,指针本身是常量,这样可以防止改变指针指向的位置。
c++禁止将const的地址赋给非const指针,如下,这是错误的;为什么呢?因为定义的变量是一个常量,而定义的指针却可以去修改这个常量的值,很现实是矛盾的。
- const float h_moon = 1.63;
- float *pm = &h_moon;
所以可以这么记:const的比非const的更高级。
将指针参数声明为指向常量数据的指针的理由:
1.可以避免由于无意间修改数据而导致的指针错误;
2.使用const使得函数能够处理const和非const实参,否则只能接受非const数据。
所以加上const没毛病。
看下面两种sum()函数原型,都是可以的。
- int data[3][4] = {{1,2,3,4}, {5,6,7,8}, {3,4,6,7}}
- int toal = sum(data,3);
-
- int sum(int (*ar2)[4],int size);//原型1
-
- int sum(int ar2[][4], int size);//原型2
ar2[r][c] == *(*(ar2 +r) + c)
可以自己琢磨一下上面这行代码;
说明:ar2就代表此二维数组的首地址,r代表的是行,所以它包含了这一行的所有元素,并不是单单的一个元素,所以+r代表的偏移量是二维数组列的长度,比如上面的4,然后*--取出偏移后的这一行的所有元素,再+c就是所需要的元素地址了,然后解地址*就是所需要的元素了。
将字符串作为参数传递给函数,有三种表示方式,都是char指针,char*类型。
- 1.char数组;
- 2.用引号括起来的字符串常量(也称字符串字面值);
- 3.被设置为字符串的地址的char指针;
-
- char ghose[15] = "goodmoring";
- char *str = "goodmoring";
- int n1 = strlen(ghose);
- int n2 = strlen(str);
- int n3 = strlen("goodmoring");
程序清单7.9; · 96cb0b2 · Kite/C和C++ - Gitee.com
说个重要的概念,不以空字符结尾的数组也只是普通的数组,而不是字符串,字符串有内置的结束字符。
这里不明白的话,就需要自己去加深一下对字符数组和字符串数组的理解了。可以看下下面这篇文章。