深入理解C指针之---传递数组

  一、传递数组:将数组作为参数传入函数,或将数组作为数据当成是函数的返回值

    1、定义:可以传入和传出数组

    2、特征:

      1)、将数组作为参数传递给函数的本质是传递数组的地址,这种传递无需复制数组元素,所以更加高效;

      2)、数组名自身暗中包含了数组的大小,传递过程中只包含地址,因而丢失了数组大小信息;

 1 #include <stdio.h>
 2
 3 void displayArr(int arr[]){
 4     for(int i = 0; i < 10; i++){
 5         printf("%d\t", arr[i]);
 6     }
 7     printf("\n");
 8
 9     return;
10 }
11
12 int main(int argc, char **argv)
13 {
14     int arrInt[] = {1, 2, 3, 4, 5, 6, 7, 8,};
15     16     displayArr(arrInt);
17
18     return 0;
19 }

    说明:由于在displayArr()函数中缺少了数组长度,由于盲目指定了数组长度,因此会输出多余的垃圾值。


      3)、将数组作为参数时,可以使用数组表示法,arrName[]表示法;

 1 #include <stdio.h>
 2
 3 void displayArr(int arr[], int size){
 4     for(int i = 0; i < size; i++){
 5         printf("%d\t", arr[i]);
 6     }
 7     printf("\n");
 8
 9     return;
10 }
11
12 int main(int argc, char **argv)
13 {
14     int arrInt[] = {1, 2, 3, 4, 5, 6, 7, 8,};
15     int size = sizeof(arrInt) / sizeof(int);
16     displayArr(arrInt, size);
17
18     return 0;
19 }

    说明:由于在displayArr()函数声明中使用数组表示法,传入了数组长度,在函数内部使用数组法(也可以使用指针法),保证了程序的健壮行。

      4)、将数组作为参数时,可以使用指针表示法,*arrName表示法;

 1 #include <stdio.h>
 2
 3 void displayArr(int *arr, int size){
 4     for(int i = 0; i < size; i++){
 5         printf("%d\t", *(arr + i));
 6     }
 7     printf("\n");
 8
 9     return;
10 }
11
12 int main(int argc, char **argv)
13 {
14     int arrInt[] = {1, 2, 3, 4, 5, 6, 7, 8,};
15     int size = sizeof(arrInt) / sizeof(int);
16     displayArr(arrInt, size);
17
18     return 0;
19 }

    说明:由于在displayArr()函数声明中使用指针表示法,传入了数组长度,在函数内部使用指针法(也可以使用数组法),保证了程序的健壮行。

      5)、采用指针表示法和采用数组表示法必须传入数组的长度;

    3、指针数组的应用:

      1)、声明方式:int*  arrName[size],此时数组中的元素是指针,若需要获取指针的内容,需要使用解析操作符;

      2)、数组元素需要手动分配内存空间;

      3)、使用数组表示法获取数组元素的内容:*arrName[index]获取指针内容;

      4)、arrName[index] 等价于(*arrName + index),切记其中存储的是整型指针

      5)、使用*arrName[index]获取数组下标对应的地址处的内容

      6)、使用指针表示法获取数组元素的内容:*(*arrName + index)获取指针内容;

      7)、(*arrName + index)等价于arrName[index],切记其中存储的是整型指针

      8)、使用*(*arrName + index)获取指针运算后对应的地址处的内容

      9)、如果不能确定具体的方式,就在初始化和输出使用同一种方式

      10)、在代码2中如果在初始化时,使用第10行代码的形式,可以使用第15行代码输出数据

      11)、在代码2中如果在初始化时,使用第10行代码的形式,可以使用第16行代码输出数据

      12)、在代码2中如果在初始化时,使用第10行代码的形式,可以使用第18行代码输出数据

      13)、在代码2中如果在初始化时,使用第11行代码的形式,可以使用第17行代码输出数据

      14)、在代码2中如果在初始化时,使用第11行代码的形式,可以使用第18行代码输出数据
  代码如下代码1:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 void displayArr(int **arr, int size){
 5     for(int i = 0; i < size; i++){
 6         printf("%d\t", *(*arr + i));
 7     }
 8     printf("\n");
 9
10     return;
11 }
12
13 int main(int argc, char **argv)
14 {
15     int size = 6;
16     int* arrInt[size];
17     for(int i = 0; i < size; i++){
18         *(arrInt + i) = (int *)malloc(sizeof(int));
19         *(*arrInt + i) = i + 1;
20     }
21     displayArr(arrInt, size);
22
23     return 0;
24 }

    再看下面的代码代码2:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 int main(int argc, char **argv)
 5 {
 6     int size = 5;
 7     int* arrInt[size];
 8     for(int i = 0; i < size; i++){
 9         arrInt[i] = (int *)malloc(sizeof(int));
10         //*arrInt[i] = 101 + i;
11         *(*arrInt + i) = 101 + i;
12     }
13
14     for(int i = 0; i < size; i++){
15         //printf("%d\t", arrInt[i][0]);
16         //printf("%d\t", *arrInt[i]);
17         //printf("%d\t", *(*arrInt + i));
18         printf("%d\t", **arrInt + i);
19     }
20
21     return 0;
22 }

  3、传出,将数组返回

人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。