zoukankan      html  css  js  c++  java
  • 25深入理解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	", arr[i]);
     6     }
     7     printf("
    ");
     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	", arr[i]);
     6     }
     7     printf("
    ");
     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	", *(arr + i));
     6     }
     7     printf("
    ");
     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	", *(*arr + i));
     7     }
     8     printf("
    ");
     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	", arrInt[i][0]);
    16         //printf("%d	", *arrInt[i]);
    17         //printf("%d	", *(*arrInt + i));
    18         printf("%d	", **arrInt + i);
    19     }
    20
    21     return 0;
    22 }

      3、传出,将数组返回

  • 相关阅读:
    站点被百度惩处应从哪些方面分析
    SVN 权限配置具体说明
    关于数组的应用
    实现键值对存储(二)——以现有键值对存储为模型
    大数据Lambda架构
    关于c++primer的一个代码错误
    怎样解决Ubuntu发热严重地问题
    【maven】pom.xml文件没错,但是项目有小红叉,Problems中可以看到错误:“Dynamic Web Module 3.0 requires Java 1.6 or newer.”
    【shiro】2.spring整合shiro,注解控制shiro用户/角色/权限And/OR,没有权限跳转到固定页面
    【shiro】使用shiro搭建的项目,页面引用js,报错:Uncaught SyntaxError: Unexpected token <
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/6960844.html
Copyright © 2011-2022 走看看