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

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

    2、特征:

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

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

  #include <stdio.h>

  void displayArr(int arr[]){
for(int i = ; i < ; i++){
printf("%d\t", arr[i]);
}
printf("\n"); return;
} int main(int argc, char **argv)
{
int arrInt[] = {, , , , , , , ,};
displayArr(arrInt); return ;
}

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

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

  #include <stdio.h>

  void displayArr(int arr[], int size){
for(int i = ; i < size; i++){
printf("%d\t", arr[i]);
}
printf("\n"); return;
} int main(int argc, char **argv)
{
int arrInt[] = {, , , , , , , ,};
int size = sizeof(arrInt) / sizeof(int);
displayArr(arrInt, size); return ;
}

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

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

  #include <stdio.h>

  void displayArr(int *arr, int size){
for(int i = ; i < size; i++){
printf("%d\t", *(arr + i));
}
printf("\n"); return;
} int main(int argc, char **argv)
{
int arrInt[] = {, , , , , , , ,};
int size = sizeof(arrInt) / sizeof(int);
displayArr(arrInt, size); return ;
}

    说明:由于在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:

  #include <stdio.h>
#include <stdlib.h> void displayArr(int **arr, int size){
for(int i = ; i < size; i++){
printf("%d\t", *(*arr + i));
}
printf("\n"); return;
} int main(int argc, char **argv)
{
int size = ;
int* arrInt[size];
for(int i = ; i < size; i++){
*(arrInt + i) = (int *)malloc(sizeof(int));
*(*arrInt + i) = i + ;
}
displayArr(arrInt, size); return ;
}

    再看下面的代码代码2:

  #include <stdio.h>
#include <stdlib.h> int main(int argc, char **argv)
{
int size = ;
int* arrInt[size];
for(int i = ; i < size; i++){
arrInt[i] = (int *)malloc(sizeof(int));
//*arrInt[i] = 101 + i;
*(*arrInt + i) = + i;
} for(int i = ; i < size; i++){
//printf("%d\t", arrInt[i][0]);
//printf("%d\t", *arrInt[i]);
//printf("%d\t", *(*arrInt + i));
printf("%d\t", **arrInt + i);
} return ;
}

  3、传出,将数组返回

25深入理解C指针之---传递数组的更多相关文章

  1. 26深入理解C指针之---不规则数组与指针

    一.不规则数组:每一行的列数不相等 1.复合字面量: 1).复合字面量是一种C构造 2).外形和数组声明差不多,写法与类型转换一样,(int[3]){10, 20, 30,} 3).将多个复合字面量可 ...

  2. &lt;深入理解C指针&gt;学习笔记和总结 第四章 指针和数组

    数组是一个什么玩意: 数组和指针我的理解,有同样之处也有不同之处.因有同样之处,因此一些资料上说,数组和指针本质是同样的.因有不同之处,因此也有一些资料上说,数组和指针是不一样的. 同样之处: 数组名 ...

  3. 深入理解C指针之四:指针和数组

    原文:深入理解C指针之四:指针和数组 数组是C内建的基本数据结构,数组表示法和指针表示法紧密关联.一种常见的错误认识是数组和指针完全可以互换,尽管数组名字有时可以当做指针来用,但数组的名字不是指针.数 ...

  4. 33深入理解C指针之---通过字符串传递数据

    一.传递字符串:在函数的参数列表中,将参数声明为char指针即可实现通过字符串传递参数 1.特征: 1).字符串以char指针的形式传递,一般是const指针传递: 2).使用字符数组声明字符串,调用 ...

  5. 数组与指针的区别,以及在STL中传递数组/指针

    数组和指针在作为实参传入T[] 或T*的形参时没有区别 void f(int pi[]) { cout << sizeof(pi) << endl; } int a[5] = ...

  6. 23深入理解C指针之---数组的基础

    数组是c语言内置的数据结构,数组有一维数组.二维数组和多维数组.使用数组传递数组时,必须传入数组的大小. 一.数组的特征:阐明数组的特点 1.数组要素: 1).数组类型:数组中存储的数据的类型: 2) ...

  7. 深入理解C指针之五:指针和字符串

    原文:深入理解C指针之五:指针和字符串 基础概念 字符串可以分配到内存的不同区域,通常使用指针来支持字符串操作.字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常 ...

  8. 深入理解C指针之三:指针和函数

    原文:深入理解C指针之三:指针和函数 理解函数和指针的结合使用,需要理解程序栈.大部分现代的块结构语言,比如C,都用到了程序栈来支持函数的运行.调用函数时,会创建函数的栈帧并将其推到程序栈上.函数返回 ...

  9. C 真正理解二级指针

    本文转载自CSDN博主liaoxinmeng,做数据结构时遇到指针方面的问题,想了许久,因此我觉得很有必要复习一下二级指针及其使用 正文如下: 指针是C语言的灵魂,我想对于一级指针大家应该都很熟悉,也 ...

随机推荐

  1. 音频框架TheAmazingAudioEngine实现音效

    TheAmazingAudioEngine是Michael Tyson开源的iOS第三方音频框架.很多音频类APP应用这个框架作开发. 应用这个框架,可以比较方便地实现iOS音频开发中的各种音效的实现 ...

  2. Js 数组去重的几种方法总结

           去重是开发中经常会碰到的一一个热点问题,不过目前项目中碰到的情况都是后台接口使用SQL去重,简单高效,基本不会让前端处理去重.那么前端处理去重会出现什么情况呢?假如每页显示10条不同的数 ...

  3. 2829: 高精A+B [1*+]

    题目描述 输入A和B,计算A+B的值 Input 两行数据,分别是A和B 0<=A<=1E200 0<=B<=10^200 Output A+B的结果 Sample Input ...

  4. pm2日志记录和日志分割

    pm2日志记录和日志分割 pm2介绍 pm2是nodejs进程管理工具,现在基本是node生产服务器的标准选择,可以帮助我们实现node多进程服务,开启的多个实例自动实现负载均衡. 最重要的是保证no ...

  5. Unity基础-外部导入C# Dll(汇编集)

    外部导入C# Dll(汇编集) 使用创建一个dll工程 添加依赖的dll 导入Unity中,放入Assets的任意文件夹中 使用代码生成的dll汇编集只要"use dll的名字"引 ...

  6. Voyager的数据库操作与Bread Builder,解决国内打开网速超级慢的问题

    Products表的创建: Bread Builder 伟大的XX封了谷哥,所以有关网站实在是打不开,正准备放弃的时候,突然发现问题了,对就是这个网站ajax.googleapis.com,由于调用的 ...

  7. quartz 任务调度

    quartz 设置参数, 获取参数 在job中使用spring注入的service对象 循环获取所有的job 删除job @PersistJobDataAfterExecution @Disallow ...

  8. python学习之判断和循环的使用

    作为一个小白运维,工作中常常发现很多东西还是自动化的好一点,所以就想到的用python来编写脚本.当然,我肯定是不会的啦,哈哈哈~~~~所以啦,身为一个懒癌晚期的上班族不得不在闲余时间来好好学学pyt ...

  9. GoogleTest 之路3-Mocking Framework

    当你写一个原型或者测试的时候,依赖整个object 是不可行和明智的.一个 mock object和 real object 有同样的接口(所以它可以像同一个使用),但是让你在运行时进行指定它应该如何 ...

  10. Django ORM (三) 查询,删除,更新操作

    ORM 查询操作 修改 views.py 文件 from django.shortcuts import render, HttpResponse from app01 import models f ...